2016-07-24 77 views
3

注意,相关Value of this inside object method?Function.prototype.call不将此设置为Arrow功能

鉴于

var obj = { 
    property: 5, 
    func1: function() { 
    console.log(this.property); 
    }, 
    func2:() => { 
    console.log(this.property); 
    } 
} 

thisWindowobj.func2()

当尝试使用Function.prototype.call()设置thisobjthis仍然Window

var obj = { 
 
    property: 5, 
 
    func1: function() { 
 
    console.log(this.property); 
 
    }, 
 
    func2:() => { 
 
    console.log(this.property); 
 
    } 
 
} 
 

 
obj.func2.call(obj);

  1. 这是预期的行为?

  2. 为什么Function.prototype.call()没有设置的context obj.func2obj

+4

'this'为箭头功能从外上下文捕获,所以这是预期的行为。 – zerkms

+0

@zerkms'Function.prototype.call','Function.prototype.apply'无法设置'context':'this'的箭头函数? – guest271314

+1

Nope,http://www.ecma-international.org/ecma-262/6.0/#sec-arrow-function-definitions-runtime-semantics-evaluation – zerkms

回答

4

预计按the standard

一个ArrowFunction为参数,超好,这或new.target没有定义本地绑定。在ArrowFunction内对arguments,super,thisnew.target的任何引用必须解析为在词汇封闭环境中的绑定。

这意味着 - 你不能设置未定义的东西。

此外,相关:

的函数被称为与设置this结合作为

[[Call]]内部插槽
  • 执行OrdinaryCallBindThis(F, calleeContext, thisArgument)
  • 而这又checks

    1. thisModeF[[ThisMode]]内部槽的值。
    2. 如果thisMode是词汇,则返回NormalCompletion(undefined)

    所以,在内部具有对功能是否被词法作用域的额外的检查(箭头功能)或没有。

    参考文献: