var name = "The Window";
var getNameFunc= {
name: "My Object",
getNameFunc: function() {
return function() {
return this.name;
};
}
};
alert(object.getNameFunc()()); //"The Window"(在非严格模式下)
在高级程序设计的第7章,7.2.2关于this对象中,有几句话实在是不太明白:
以上代码先创建了一个全局变量 name,又创建了一个包含 name 属性的对象。这个对象还包含一个方法——getNameFunc(),它返回一个匿名函数,而匿名函数又返回 this.name。由于 getNameFunc()返回一个函数,因此调用 object.getNameFunc()()就会立即调用它返回的函数,结果就是返回一个字符串。然而,这个例子返回的字符串是"The Window",即全局 name 变量的值。为什么匿名函数没有取得其包含作用域(或外部作用域)的 this 对象呢?
前面曾经提到过,每个函数在被调用时都会自动取得两个特殊变量: this 和 arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。
1.只会搜索到其活动对象??? 不是有个作用域链吗?匿名活动对象在最下面,在匿名对象中找不到,那就去上面的活动对象去找咯?getNameFunc中找不到就去object去找咯。。。不就找到了吗
2.因此永远不可能直接访问外部函数中的这两个变量???是什么意思?外部函数是指哪个?
你可以通过修改尝试对
this
加深一下理解 .1) 将匿名函数独立出来给个名字.
稍微调整如下:
现在你再来看这个
getThisName
这个原来你代码里面的匿名函数,你是不是可以很清楚的看出它的调用方是认谁了? 很显示到最后调用这个方法时是隐式的全局变量 (window, 在浏览器环境)它跟上面声明的
object
没有任何关系. 只是object.getNameFunc
这个函数将这个函数作为返回值.如果是返回的其他标量,自然也不会发生关系.
另外你上面的书也提到了,
this
和arguments
这两个隐式的变量是在函数调用的时候才获得的.所以在这个函数被调用的时候明显它的
this
只能是全局的this
.2) 将 object 直接跟
getThisName
建立关系:观察上面的输出,你再加深以下对这句话的理解:
3) 加深对函数调用的理解, 加上
apply
和call
你看一下如下代码的输出:
同时你也可以通过使用
apply
,call
等内置函数原型的方法来指定函数调用时所使用的 this 对象. 如上所示.JavaScript 的这一特点, 跟 Java 等静态语言是很不同的. Java 等静态语言,往往由于你方法(注意这里没有说函数)写的地方就决定了
this
对象的指向,但是 JavaScript 是动态语言这一点很不一样. 所以还需要在后面的实践中多多注意总结和理解.