在JavaScript Enlightenment一书中(链接是到预发布的版本(第85页),但我有已发布的版本(第6.3章),它说了同样的话),它说任何内部函数都会将this视为ECMA-3中的全局对象(window),但将在ECMA-5中修复。
代码如下:
http://jsfiddle.net/javascriptenlightenment/9GJhu/
var myObject = {
func1: function() {
console.log(this); // logs myObject
var func2 = function() {
console.log(this) // logs window, and will do so from this point on
var func3 = function() {
console.log(this); // logs window, as it’s the head object
}();
}();
}
}
myObject.func1();但我认为当前的Chrome、火狐和node.js应该在很大程度上实现ECMA-5,所以我在它们中尝试了上面的代码,它们仍然在func2和func3中打印出全局对象。然后,我将"use strict";添加到func1中,以防万一,也添加到func2和func3中。代码:http://jsfiddle.net/9GJhu/6/现在在Chrome和node.js中,this将打印为undefined,而不是myObject。因此,根据这本书,在ECMA-5中,this应该是myObject。上面的代码有什么问题?
发布于 2013-03-06 16:10:37
我可能错了,但我在规范中没有看到这本书所暗示的任何东西。
根据ECMAScript 5.1 specification 10.4.3输入功能代码
根据(1.),由于您的func2和func3没有任何上下文,并且您指定了strict mode,因此您的上下文将被设置为undefined。在不使用strict mode的情况下,根据(2),this将设置为window。
发布于 2013-03-06 16:11:34
当您使用'use strict‘指令时,'this’关键字默认情况下是'undefined‘,而非严格模式则是默认情况下'this’关键字是指全局对象。您需要显式指定上下文。
顺便说一句,你应该只需要声明“use strict”一次。
发布于 2013-03-06 16:34:46
这些函数是嵌套的,这并不意味着什么。它们继续以相同的方式工作,也不嵌套:
var myObject = {
func1: function() {
console.log(this); // logs myObject
}
}
myObject.func1();
var func2 = function() {
console.log(this) // logs window, and will do so from this point on
}();
var func3 = function() {
console.log(this); // logs window, as it’s the head object
}();http://jsfiddle.net/NYr3y/2/
var myObject = {
func1: function() {
"use strict";
console.log(this); // logs myObject
}
}
myObject.func1();
var func2 = function() {
"use strict";
console.log(this) // logs window, and will do so from this point on
}();
var func3 = function() {
"use strict";
console.log(this); // logs window, as it’s the head object
}();http://jsfiddle.net/4B84u/2/
第一个函数是通过上下文(作为方法)调用的,因此"this“就是myObject。
其他函数是在没有上下文的情况下调用的(就像func2()一样),在这种情况下,ECMA-5不允许通过它显式引用全局对象。
默认情况下,大多数浏览器不会应用ECMA-5,因为限制更多,因此不能追溯兼容。
https://stackoverflow.com/questions/15241647
复制相似问题