2016-12-03 29 views
0

我注意到一些东西在玩耍时引发了一个快速问题。Javascript:全局上下文和函数上下文声明

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

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

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的作品'(特殊规则适用于全球上下文吗?)还是我错过了什么?

谢谢。

回答

1

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

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

功能functionHopefullyInMyObjectCtx无法从外部访问。

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

在函数中声明一个函数并不会将它自动附加到this。但是功能的私密性是唯一范围内访问它在声明

如果你想从myObject.myObjectFunction那么这里访问functionHopefullyInMyObjectCtx功能是一种方法:

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

它实际上understanda BLE。功能是对象。 Myobject和myobjectfunction是两个不同的对象。 “这个”也是自身的功能。

在您的示例中,您将在myobjfunction中定义希望的功能,而不是在myobject中定义。

0

我相信我找到了我正在寻找的答案。

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

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

如果我错了或者它不太合适,请继续纠正我。

谢谢你的帮助。

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

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

相关问题