如果我使用`function.apply(undefined,args)`,为什么`this`设置为`window`?

时间:2015-10-28 02:03:05

标签: javascript this apply window-object

看一下这个例子:

<md-autocomplete md-no-cache="false" md-selected-item="selectedItem" md-search-text-change="searchLocation(searchText)"
                    md-search-text="searchText" md-items="item in searchResult" md-item-text="item.address"
                    md-selected-item-change="changeLocation(item)" md-min-length="0" md-floating-label="Your Address" ng-blur="unFocus()">
            <md-item-template>
                <span md-highlight-text="searchText" md-highlight-flags="^i">{{item.address}}</span>
            </md-item-template>
            <md-not-found>
                <i>Not Found {{searchText}}</i>
            </md-not-found>
</md-autocomplete>

为什么function aaa () { console.dir(this) } function bbb () {} aaa.apply(undefined, [1,2,3]) // this in aaa is `window` object aaa.apply(bbb, [1,2,3]) // this in aaa is `bbb` function 在第一个应用案例中设置为this,即使我试图强制它为window

2 个答案:

答案 0 :(得分:5)

当不处于严格模式且nullundefined作为.apply()的第一个参数传递时,this将被设置为全局对象window 1}}在浏览器中。

在严格模式下,它会将this设置为您传递的实际值。

一般来说,非严格模式试图容忍错误,甚至修复&#34;你自动犯了一些错误。这被证明有时是一个问题,因为应该立即编码错误的东西被掩盖了#34;由系统。严格模式的发明有很多原因,其中一个原因就是停止隐藏编码错误。

答案 1 :(得分:1)

因为如果您不在strict mode中,函数调用的工作原理。如果没有严格模式,函数的this引用总是引用一个对象,如果没有给出其他对象,它将成为全局对象(即window)。