重写JavaScript中的全局属性
在阅读了我在链接帖子上的评论后,我决定测试一下重写JavaScript中的全局属性,javascript,scope,global,Javascript,Scope,Global,在阅读了我在链接帖子上的评论后,我决定测试一下窗口对象和全局范围。我阅读了一些关于如何引用原始函数的其他问题,例如,和,但所有这些问题通常都涉及将原始函数存储在另一个变量中或将其包装在匿名函数(单独的命名空间)中 测试代码 看。注意,在fiddle初始化之后,您可能需要点击Run来查看延迟 实验结果 预期结果 有人能解释为什么我的代码行为与预期不同吗 此外,我意识到在浏览器环境之外运行的JavaScript会有所不同,因此出于这个问题的目的,我将只讨论浏览器环境中的JavaScript应用程序。
窗口
对象和全局范围。我阅读了一些关于如何引用原始函数的其他问题,例如,和,但所有这些问题通常都涉及将原始函数存储在另一个变量中或将其包装在匿名函数(单独的命名空间)中
测试代码
看。注意,在fiddle初始化之后,您可能需要点击Run来查看延迟
实验结果
预期结果
有人能解释为什么我的代码行为与预期不同吗
此外,我意识到在浏览器环境之外运行的JavaScript会有所不同,因此出于这个问题的目的,我将只讨论浏览器环境中的JavaScript应用程序。您在JSFIDLE中的代码不会在全局范围内运行。这就是为什么
window.x
在声明和定义x
之后是undefined
至于局部范围的重新定义。您可以这样做:
var a;
a = b();
function b() {
return 5;
}
console.log(a); // 5
您可以在声明和定义b之前调用它,因为它已移动到顶部。这也被称为吊装
即使您这样做:
function b () {
return 1;
}
(function () {
console.log(b()); // 2, not 1
function b() {
return 2;
}
}());
再次,因为吊装。实际执行顺序为:
var b;
b = function () {
return 1;
}
(function () {
var b;
b = function b() {
return 2;
}
console.log(b()); // 2, makes sense
}());
我很出名!哈哈,我觉得这很酷,你实际上把它从评论中拿出来,并提出了一个问题,而不是争论它或只是驳回它
var a;
a = b();
function b() {
return 5;
}
console.log(a); // 5
function b () {
return 1;
}
(function () {
console.log(b()); // 2, not 1
function b() {
return 2;
}
}());
var b;
b = function () {
return 1;
}
(function () {
var b;
b = function b() {
return 2;
}
console.log(b()); // 2, makes sense
}());