如何确定this的值 

this值会被传递给所有函数,this的值是基于运行时调用函数的上下文。

例如:从全局作用域调用sayFoo函数时,this引用window对象, 当它作为myObject的一种方法调用时,this引用myObject

        var foo = "foo";
var myObject = { foo: "I am myObject.foo" }; var sayFoo = function () {
console.log(this.foo);
}; //给myObject设置一个sayFoo属性,并指向sayFoo函数
myObject.sayFoo = sayFoo;
myObject.sayFoo();//输出 I am myObject.foo
sayFoo(); //输出foo

在嵌套函数中用this关键字引用head对象

当在嵌套函数内部使用this时,在ES3中,this失去了方向,引用的是head对象

例如:func2和func3内部的this失去了方向,引用的不是myObject,而是head对象

var myObject = {

            func1: function() {
console.log(this); //输出myObject var func2 = function() {
console.log(this); //输出window,从此处开始,this都是window对象了 var func3 = function () {
console.log(this);//输出window,即head对象
}();
}();
}
};
myObject.func1();

当匿名函数在函数内部被调用时,匿名函数内的this值将是head对象。例如:

var foo = {
func1: function(bar) {
bar(); //输出window,而不是foo
console.log(this); //这里的this关键字是foo对象的一个引用
}
};
foo.func1(function() {
console.log(this);
});

当this值得宿主函数被封装在另外一个函数内部或在另一个函数的上下文中被调用时,this值将永远是对head对象的引用。

充分利用作用域链研究嵌套函数问题

可以简单的在父函数中使用作用域链来保留对this的引用,以便this值不丢失。如下代码演示通过 that变量以及其作用域来有效的跟踪函数上下文:

 //充分利用作用域链研究嵌套函数问题
var myObject = {
myProperty:"I can see the light",
myMethod: function() {
var that = this; //myMethod作用域内,保存this引用(也就是myObject)
var helperFunction = function() { //子函数
//输出通过作用域链得到“I can see the light”
console.log(that.myProperty);
console.log(this.myProperty);
console.log(this);
}();
}
};
myObject.myMethod();//调用myMethod

使用call()或apply()控制this值

this值通常取决于调用函数的上下文,但是我们可以使用apply()或call()来重写/控制this值

call()和apply()的区别在于函数传递参数的方式不同

如果使用call(),参数只是用逗号分隔的值

如果使用apply(),参数值以数组的形式传递。

例如如下:通过 call调用函数,以便使函数内部的this值将myObject作为它的上下文

//使用call()或apply()控制this值
var myObject = {};
var myFunction = function(parm1, parm2) {
//调用函数的时候,通过call()将this指向myObject
this.foo = parm1;
this.bar = parm2;
console.log(this);
};
myFunction.call(myObject, "foo", "bar");//调用函数,设置this值引用到myObject
console.log("foo=" + myObject.foo + ",bar=" + myObject.bar); //输foo=foo,bar=bar

改为直接调用的结果为:

       var myObject = {};
var myFunction = function(parm1, parm2) {
//调用函数的时候,通过call()将this指向myObject
this.foo = parm1;
this.bar = parm2;
console.log(this);
};
myFunction("foo", "bar");//直接调用,this指向window
console.log("foo=" + myObject.foo + ",bar=" + myObject.bar);//foo=undefined,bar=undefined
console.log("foo=" + myFunction.foo + ",bar=" + myFunction.bar);//foo=undefined,bar=undefined
console.log("foo=" + foo + ",bar=" + bar);//foo=foo,bar=bar

在用户自定义构造函数内部使用this关键字

使用new关键字调用函数时,this值(在构造函数中声明的)引用实例本身。

例如:如下代码创建了Person构造函数,创建Person的实例时,this.name将引用新创建的对象。

       var Person = function(name) {
this.name = name || "john doe";//this引用所创建的实例
}; var cody = new Person("Cody Lindley");//基于Person构造函数创建实例
console.log(cody.name);//输出Cody Lindley

使用new关键字调用构造函数时,this引用“即将创建的对象”

如果不使用new关键字,this值将是调用Person的上下文—在本例中是head对象。如下代码:

        var Person2 = function (name) {
this.name = name || "john doe"; //this引用所创建的实例
}; var cody2 = Person2("Cody Lindley"); //基于Person构造函数创建实例
console.log(cody2.name); //报name不存在,实际上name值设置到了window.name上
console.log(window.name); //输出Cody Lindley

原型方法内的this关键字引用构造函数实例

当在添加至构造函数的prototype属性的函数中使用this时,this引用调用方法的实例,例如:

       //原型方法内的this关键字引用构造函数实例
var Person = function(x) {
if (x) {
this.fullName = x;
}
}; Person.prototype.whatIsMyName = function() {
return this.fullName;//this引用Person()所创建的实例上
}; var cody = new Person("cody lindley");
var lisa = new Person("lisa lindley"); //调用继承的whatIsMyName方法,该方法用this引用实例
console.log(cody.whatIsMyName(), lisa.whatIsMyName()); //输出cody lindley,lisa lindley Object.prototype.fullName = "John Doe";
var john = new Person();
console.log(john.whatIsMyName());

当在prototype对象中的方法内部使用this关键字时,this可用于引用实例。如果该实例不包含所要查找的属性,则继续在原型上查找。

javascript中的this值的更多相关文章

  1. javascript中的原始值和复杂值

    × 目录 [1]特性 [2]存储方式 [3]访问方式 [4]比较方式 [5]动态属性 前面的话 javascript的数据类型可以分为两种:原始类型和引用类型.原始类型也称为基本类型或简单类型,jav ...

  2. Javascript中的Keycode值列表

    关于如何得到一个键在Javascript中的Keycode值,可以参考: <body onkeypress=alert(event.keyCode)>请按任意键,你将得到该键的键值! ke ...

  3. 你知道JavaScript中的结果值是什么吗?

    你知道JavaScript中的每条语句.甚至表达式都有一个结果值吗? 当你在浏览器中测试代码时,经常会在控制台的输出结果的最后面多出一条,大部分为undefined,这个undefined就是一个结果 ...

  4. 在javascript中检查一个值是否为integer

    integer 类型在javascript中很奇怪.ECMAScript技术规格说明书中,它是以概念的形式存在.number类型包括浮点型(floating )和整形(integer )不包括小数(详 ...

  5. 论javascript中的原始值和对象

    javascript将数据类型分为两类:原始值(undefined.null.布尔值.数字和字符串),对象(对象.函数和数组) 论点:原始值不可以改变,对象可以改变:对象为引用类型: '原始值不可以改 ...

  6. 关于javascript中=的返回值

    今天看了一段代码,大概是这样的: function test(){ a=4; b=5; return b=a; } test();//返回? 返回值是多少呢?运行结果是4 这可以理解为将a的值赋给b以 ...

  7. [java面试]javascript中dom取值问题radio名字一样归属于同一个组,求点击的是哪一个

    题目描述: 看如下的html文件,里面定义了一些radio类型的元素,请完成parse()函数的内容,要求能够弹出对话框提示当前选中的是第几个单选框. </pre><pre code ...

  8. JavaScript中函数作为值

    function myfunc() { // .. } 这是个函数,这样理解, myfunc只是外层作用域的一个变量,指向刚刚声明的function. 也就是说,function本身就是一个值, 就像 ...

  9. 在JavaScript中引用类型和值类型的区别

    一.存储方式不一样 基本数据类型 变量存储的是简单的数据段,存储的是具体的值,是轻量级的数据存储方式 引用类型 引用类型的值,可以由多个值构成的对象,引用类型的变量存储的是对象引用地址.引用类型是重量 ...

随机推荐

  1. cat 命令

    cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [选项] [文件] ...

  2. Unity UGUI——提供可视功能的UI组件(Text)

    基本属性介绍 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTXJfQUhhbw==/font/5a6L5L2T/fontsize/400/fill/I0J ...

  3. 解密SVM系列(二):SVM的理论基础(转载)

    解密SVM系列(二):SVM的理论基础     原文博主讲解地太好了  收藏下 解密SVM系列(三):SMO算法原理与实战求解 支持向量机通俗导论(理解SVM的三层境界) 上节我们探讨了关于拉格朗日乘 ...

  4. CSMA/CD解释与理解

    1. CSMA/CD含义 CSMA/CD即载波监听多点接入/碰撞检测,此协议是使用在总线型网络中的,不同计算机是通过多点接入的方式连接在一起.协议的重点在于监听和碰撞检测. 2. 为什么要监听和碰撞检 ...

  5. 转载 iOS全局检测网络变化的实时状态

      昨天浏览了cocoaChina,发现了一遍文章是优化Reachablity框架的出来的检测网络类,大家都知道这个Reachablity框架是用来检测网络变化的!但是也是有一点bug,事实上,基于此 ...

  6. linux php.ini又一次载入问题

    今天发现自己server改动php.ini之后无法又一次载入! .无法使用php-fpm reload,奇怪.! 后来查了一下.能够使用 /etc/init.d/php-fpm reload 来又一次 ...

  7. centos7.0 crontab 的yii计划任务没有执行

    */1 * * * * /www/yii solr/update-article 创建了每分钟执行一次的计划而计划任务没有执行 原因是自己少加了执行用户 */1 * * * * php /www/yi ...

  8. HDOJ 3473 Minimum Sum

    划分树,统计每层移到左边的数的和. Minimum Sum Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  9. IntelliJ IDEA(2017)安装和破解(转发)

    IntelliJ IDEA(2017)安装和破解 IDEA 全称 IntelliJ IDEA,是Java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手 ...

  10. MySQL——存储过程

    核心知识点: 1.什么存储过程?它都有哪些优点? 2.存储过程的语法和参数? 3.存储过程有哪些操作? 4.存储过程常用的控制语句? 一.存储过程概论 SQL语句需要先编译然后执行,而存储过程是一组为 ...