为什么定义在函数内部的x在我没有声明它为变量的情况下变成了一个全局变量?
Why does x, defined inside a function, become a global variable when I didn't declare it to be a variable in the first place?
提前感谢你的帮助!
var f2 = function() {
x = "inside f2";
};
f2();
console.log(x);
// → inside f2
为什么我得到x作为一个全局变量与值"内部f2"当我没有声明它是一个全局变量与"var x;"定义函数之前?
var f2 = function() {
var x = "inside f2";
};
f2();
console.log(x);
// → Uncaught ReferenceError: x is not defined
我是否正确地假设x在这种情况下没有定义,因为没有全局变量x,只有函数f2中的局部变量x ?
为什么我得到x作为一个全局变量与值"内部f2"当我没有声明它是一个全局变量与"var x;"定义函数之前?
因为规范是这么说的。如果给一个未声明的变量赋值,就会创建一个全局变量。在严格模式下,这将抛出一个错误(这是更合理的)。
我是否正确地假设x在这种情况下没有定义,因为没有全局变量x,只有函数f2中的局部变量x ?
是的。
8.7.2
PutValue (V, W)
[…]
3.如果isunresolablereference (V),则
,,。如果IsStrictReference(V)为真,则
,,,我。抛出ReferenceError异常。
,, b。调用全局对象的[[Put]]内部方法,传递GetReferencedName(V)作为属性名,传递W作为值,传递false作为Throw标志。
声明的变量(使用var子句)在声明它们的执行上下文中受到约束。未声明的变量总是全局的。
裁判:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var
执行x = "inside f2"
将爬上作用域链,直到它遇到x
或直到全局空间,在那里它将对全局对象进行属性赋值。
无论是否在全局空间中声明 x
变量的声明既可以使用也可以不使用var
关键字。主要区别在于,使用var
关键字时,变量被包含在声明它的闭包中——没有该变量就被认为是全局的。
它变成全局的原因是运行时查找闭包层次结构来查找给定的变量。当它没有找到它时,它会在全局作用域中声明它,以便您使用它。
当您执行x="inside f2"
时,您确实声明了一个变量。因为在该函数的作用域中没有x
,编译器在当前作用域中寻找这个变量。它不存在,所以它被设置为全局。
Doing var x
在当前作用域中声明变量,不一定是全局作用域。
您应该使用use strict;
来捕获这样的错误
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 为了避免创建全局变量,可以将所有变量分配给一个对象吗
- 保留 JQuery Vars 用于另一个函数(全局变量?)
- 要求JS'ing一个没有全局$变量的jQuery插件
- 给我的浏览器一个可通过javascript访问的全局变量
- 使用 grunt 在 javascript 文件中“嵌入”一个全局变量
- HTML元素在JavaScript中表示为一个全局变量,How
- 这是一个全局变量吗?
- CoffeeScript 在 'for v in values' 中创建一个全局变量 'v',导致事件中的错误引用
- 在 Jquery 中为语言切换器分配一个全局变量
- 从函数内部声明一个全局变量
- 在 TypeScript 中使用外部模块声明一个全局变量
- 将全局变量传递给另一个视图主干
- 我是否正在创建一个全局变量
- 为什么我已经定义的全局变量被IE8中的另一个var语句覆盖
- 将 React 模板放在一个全局变量的属性中
- 如何在另一个函数中访问 JavaScript 自定义全局变量
- 如何将值从一个函数传递到另一个具有对象的函数,而无需在 JS 中声明全局变量
- 如何在不声明全局变量的情况下将值从一个函数传递到另一个函数?
- 存储nodejs fs.readfile's产生一个变量并传递给全局变量