2013-03-06 23 views
1

在书JavaScript Enlightenment(链接是一个预先发布的版本(第85页),但我有已发布的版本(第6.3章),它说同样的事情),它说任何内部函数将把this视为ECMA-3中的全局对象(window),但将在ECMA-5中修复。在JavaScript中,任何独立的内部函数都将“this”当作原始方法被调用的对象吗?

的代码如下:

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,Firefox和node.js中应实现ECMA-5在很大程度上,所以我尝试以上代码,他们仍然打印出func2func3中的全局对象。然后我将"use strict";加到func1,以防万一,也加到func2func3。代码:http://jsfiddle.net/9GJhu/6/现在在Chrome和node.js中,this将作为undefined而不是myObject打印出来。所以根据这本书,在ECMA-5中this应该是myObject。上面的代码有什么问题?

回答

2

我可能是错的,但我没有看到规范中的任何地方。
按照ECMAScript 5.1 specification 10.4.3输入功能代码

  1. 如果函数代码是严格代码,则ThisBinding设置为thisArg。
  2. 否则,如果thisArg为null或未定义,请将ThisBinding设置为全局对象。
  3. 否则,如果Type(thisArg)不是Object,请将ThisBinding设置为ToObject(thisArg)。
  4. 否则将ThisBinding设置为thisArg。
  5. 让localEnv成为调用NewDeclarativeEnvironment传递F的[[Scope]]内部属性值作为参数的结果。
  6. 将LexicalEnvironment设置为localEnv。
  7. 将VariableEnvironment设置为localEnv。
  8. 设代码为F的[[Code]]内部属性的值。
  9. 使用10.5中描述的功能代码和argumentsList执行声明绑定实例化。

根据(1),因为你的func2func3没有任何背景,而你指定strict mode你的背景将被设定为undefined。如果没有strict mode并根据(2.)this将设置为window

1

当您使用'use strict'指令时,默认情况下,'this'关键字是'undefined',与非严格模式相反,'this'关键字默认指向全局对象。您需要明确指定上下文。

在附注中,您只需要声明'use strict'一次。

0

功能嵌套的事实并不意味着任何事情。他们继续工作以同样的方式还没有嵌套:

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/

第一个函数调用与上下文(作为一种方法)等,然后“本”是myObject的。

其他函数在没有上下文的情况下调用(就像func2()),在这种情况下,ECMA-5不允许通过这个明确引用全局对象。

大多数浏览器默认情况下不应用ECMA-5,因为由于限制更多而不兼容追溯。

相关问题