我在函数中有一个本地表变量,并且一个子函数应该具有一个具有相同名称的变量,同时仍然能够访问父变量.这应该是显而易见的,但不幸的是,如果我在任何地方定义一个具有相同名称的局部变量,JavaScript不允许我访问父变量:
var p = {alpha : 'beta'};
console.debug (p);
// [08:16:21.896] ({alpha:"beta"})
// Okay.
(function() {
console.debug (p);
// [08:16:21.896] ({alpha:"beta"})
// Right! JavaScript, you're so awesome!
})();
// One moment though, I think I still need the parent's table...
(function() {
var p = { 'p': p };
console.debug (p);
// [08:16:21.896] ({p:(void 0)})
// Wait, what?
})();
// Okay, maybe giving it the same name in the same statement confuses you?
(function() {
var parent_p = p;
var p = {};
console.debug (parent_p);
// [08:16:21.897] undefined
})();
// Give me back my variable! http://v.gd/jsWhyDoYouDoThis
Run Code Online (Sandbox Code Playgroud)
那里发生了什么?有什么方法可以解决这个问题吗?
尽管JavaScript看起来像C,Java等,但它们具有块级范围.JavaScript具有功能级范围.
因此在JavaScript中,if语句不会创建新块.只有功能.最重要的是,variable和function声明被"悬挂"(无形地移动)到块的顶部.这就是你问题的原因.
定义变量时:
function foo() {
bar();
var x = 1;
}
Run Code Online (Sandbox Code Playgroud)
实际上解释如下:
function foo() {
var x;
bar();
x = 1;
}
Run Code Online (Sandbox Code Playgroud)
所以,如果你读了varible x中bar(),即使是在较高的范围(外部定义foo()),它读取foo()的x,这是undefined当bar()被执行.
仔细看看你的代码,试着理解实践中发生的事情:
var p = {alpha : 'beta'};
...
(function() {
// var p = { 'p': p }; actually is:
var p;
p = { 'p': p }; // thus p inside is `undefined`
console.debug (p);
})();
(function() {
// var parent_p = p; var p = {}; actually is:
var parent_p, p;
parent_p = p; // that's why parent_p becomes undefined here
p = {};
console.debug (parent_p);
})();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
670 次 |
| 最近记录: |