我不明白的事情是使用严格的'还有这个

时间:2015-05-15 08:13:14

标签: javascript

据我所知,您在JavaScript中声明的所有内容都属于全局对象(除非您在对象内部声明某些内容,然后该对象将属于该窗口对象,并且无论您在其中声明什么内容,都属于因此,在浏览器环境中,全局对象是window

说你宣布: var x = 'hi'

可以通过以下方式访问:

x

window.x

两者完全一样,对吗?那么,为了'use strict',从全球'返回this时,为什么呢?变量,如果我指定所述函数属于window,我是否只能获取window对象?

function fun() {
    'use strict';
    return this;
}

fun(); // undefined
window.fun(); // window object
// Aren't both absolutely the same?

另外,如果函数属于undefined,为什么这个函数会返回obj

obj = {
    method: function () {
        'use strict';
        function yeah() { // Doesn't this belong to obj?
            return this;  // It certainly doesn't seem that 'yeah'
        }                 // belongs to window.
        return yeah();
    }
};

感谢。

2 个答案:

答案 0 :(得分:0)

函数内部的

this应该返回调用该函数的对象(使用obj.method()语法)。

如果以任何其他方式调用该函数,则use strict的{​​{1}}值将设置为this(例如,只需执行window而非{{1} }})。这很令人困惑。 func()确保在未将函数作为对象方法调用时,obj.func()未正确定义。

答案 1 :(得分:0)

  

为什么,当使用'使用严格的'时,从全球'返回?变量,如果我指定所述函数属于窗口,我可以只获取窗口对象吗?

您只需将window对象作为window访问即可获得该对象。

它不会成为this的价值,因为该功能很容易意外地编写不安全的代码并带来性能成本。

From MDN

  

自动装箱不仅是性能成本,而是暴露出来   浏览器中的全局对象是一种安全隐患,因为全局   object提供了对" secure" JavaScript的   环境必须限制。因此对于严格的模式功能,   指定这个没有装入一个对象,如果没有指定,这个   将是未定义的

  

另外,如果函数应该属于obj,那么为什么这个函数返回undefined?

虽然yeah属于obj方法的函数范围,但yeah本身并不是obj的方法,因为你不是&#39 ; t称之为一个。

即。因为您拨打的是yeah()而非obj.yeah()(或yeah.call(obg)等)。

这与"use strict"无关。