Bar*_*lom 26 javascript theory closures scope
在浏览器中使用这段Javascript:
<script>
console.log(window.someThing);
var x = 12;
function foo() {
window.otherThing = x;
}
</script>
Run Code Online (Sandbox Code Playgroud)
在foo我们可以访问的内部window,我们都知道,但为什么呢?
script标记内)是否将它作为隐式局部变量,它是否只是"闭包继承",因为任何其他局部变量(x如上所述)都可以?那么如何与在script标签内直接声明的变量一致,将其设置为window?的属性?(或者不是这样吗?)
<script>
var x = 12;
function() {
console.log(window.x);
}
</script>
Run Code Online (Sandbox Code Playgroud)
jAn*_*ndy 24
你可以在ECMAscript中访问"超出范围"或"自由"变量的原因就是所谓的Scope链.范围链是每个执行上下文的特殊属性.如前所述,上下文对象至少看起来像:
每次在上下文(例如函数)中访问变量(-name)时,查找过程总是从它自己开始Activation Object.所有形式参数,函数声明和本地定义的变量(var)都存储在该特殊对象中.如果在该对象中找不到变量名,则搜索进入[[Scope]]-chain.每次初始化函数(-context)时,它都会将所有父上下文变量/激活对象复制到其内部[[Scope]]属性中.这就是我们所说的,一个词汇范围.这就是闭包在ECMAscript中工作的原因.由于Global context还具有Variable Object(更准确地说,**全局对象的变量对象是全局对象本身),它也被复制到函数[[Scope]]属性中.
这就是你可以window从任何功能中访问的原因:-)
上面的解释有一个重要的概念结论:ECMAscript中的任何函数都是闭包,这是正确的.由于每个函数至少会在其[[Scope]]属性中复制全局上下文VO.
Que*_*tin 14
窗口在Javascript中真的是全局的吗?
是.除非您在较窄的范围内创建一个名为window的新变量
function foo() {
var window;
}
Run Code Online (Sandbox Code Playgroud)
在foo里面我们可以访问窗口,我们都知道,但为什么呢?
任何函数都可以访问在更广范围内声明的变量.那里的窗户没什么特别的.
它全部在ECMAScript中定义.
全球是一个词汇环境,没有外部词汇环境.所有其他环境都嵌套在其中,并绑定到具有规范指定的属性的全局对象.
这将全局对象的属性放在作用域链的起始处,所有其他环境都从该作用域继承.
全局环境是一个独特的词法环境,它在执行任何ECMAScript代码之前创建.全局环境的Environment Record是一个对象环境记录,其绑定对象是全局对象(15.1).全局环境的外部环境引用为null.
在执行ECMAScript代码时,可以向全局对象添加其他属性,并且可以修改初始属性.
在控制进入任何执行上下文之前创建唯一的全局对象.
除非另有说明,否则全局对象的标准内置属性具有属性{[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:true}.
全局对象没有[[Construct]]内部属性; 无法将全局对象用作new运算符的构造函数.
全局对象没有[[Call]]内部属性; 无法将全局对象作为函数调用.
的值[[原型]]和[[类]]全局对象的内部属性是依赖于实现的.
除了本规范中定义的属性外,全局对象还可能具有其他主机定义的属性.这可能包括一个属性,其值是全局对象本身; 例如,在HTML文档对象模型中,全局对象的window属性是全局对象本身.
| 归档时间: |
|
| 查看次数: |
18654 次 |
| 最近记录: |