Javascript:全局上下文和函数上下文声明

时间:2016-12-03 15:19:07

标签: javascript function-declaration

我在玩游戏时注意到一些事情引发了一个快速的问题。

在全局/窗口上下文中执行代码时,任何函数声明都会作为方法添加到窗口对象中。

但是当我在另一个对象的上下文中时,编写一个函数声明并不会将该方法添加到我的对象方法中。

function functionInGlobalCtx() { // This will be added as a function to the window object
  // code...
}

var myObject = {};

myObject.myObjectFunction = function () {

    var $this = this; // The context here is the 'myObject' object

    function functionHopefullyInMyObjectCtx() {
        // code...
    }
}

myObject.myObjectFunction();

为什么函数声明作为窗口对象的一部分而不是对象的一部分存在?

这简直就是“JavaScript的工作原理”和#39; (特殊规则适用于全球背景吗?)或者我错过了什么?

感谢。

3 个答案:

答案 0 :(得分:1)

全局声明的所有函数都将附加到全局窗口对象。这就是JavaScript的工作原理。

JavaScript只有函数范围。因此,在另一个函数内声明的任何函数都是外部函数的私有函数。

无法从外部访问函数functionHopefullyInMyObjectCtx

myObject.myObjectFunction = function () {
    var $this = this;
    function functionHopefullyInMyObjectCtx() {
        // code...
    }
}

在函数内声明函数不会自动将其附加到this。但是,该函数仍然是私有的,只能在声明的范围内访问。

如果您想从functionHopefullyInMyObjectCtx访问myObject.myObjectFunction功能,可以采用以下方式:

var myObject = {};

myObject.myObjectFunction = function () {
    return {
        functionHopefullyInMyObjectCtx: function() {
            console.log('I got called');
        }
    }
}

obj = myObject.myObjectFunction();
//obj now has ref to the inner function
obj.functionHopefullyInMyObjectCtx();
  

我被叫了

这是一个很好的阅读:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions

答案 1 :(得分:1)

实际上可以理解。功能是对象。 Myobject和myobjectfunction是两个不同的对象。 “这个”也是如此,并且功能本身。

在您的示例中,您在myobjfunction中定义了hopeful函数,而不是在myobject中。

答案 2 :(得分:0)

我相信我找到了我想要的答案。

为什么变量会自动分配给全局/窗口对象?

因为JavaScript引擎保留了全球环境记录'在全局范围内声明的项目(就像所有范围都有一个包含所有声明信息的环境记录一样),但全局环境记录和正常范围环境记录之间的区别在于引擎使得此记录在代码中可访问(不仅仅是引擎内部使用),通过window对象!

如果我错了或者说不对,请继续纠正我。

感谢您的帮助。

https://es5.github.io/x10.html#x10.2.3

Difference between variable declaration syntaxes in Javascript (including global variables)?