JavaScript 变量 vs 属性

4
在JavaScript中,全局变量也是window对象的属性。那么局部变量呢?它们是否是任何对象的属性?
例如:
var apple=3;
alert(apple);                   //  3
alert(window.apple);            //  same

thing();

function thing() {
    var banana=4;
    alert(banana);              //  4
    alert(thing.banana);        //  doesn’t work, of course
}

banana是任何对象的属性吗?


3
这并不是(幸运的是) - zerkms
https://dev59.com/WYbca4cB1Zd3GeqPUE-d - Marty
3个回答

7

感谢您的回答,特别是提供链接。我想这里的重点是函数通常没有自己的对象环境记录,而全局窗口对象有。 - Manngo
虽然全局窗口对象不具备环境记录,但是环境才有环境记录。全局环境恰好拥有一个全局环境记录,其绑定对象为 window(这使它成为全局对象)。 - Felix Kling

2

但是你仍然可以在函数对象中存储东西。这样你就可以在像C/C++这样的语言中拥有被称为静态变量的东西。例如:

function thing() {
    thing.banana = (thing.banana + 1) || 1;
    alert('This function was ran '+ thing.banana + ' times.');
}

thing(); // alerts "This function was ran 1 times"
thing(); // alerts "This function was ran 2 times"
thing(); // alerts "This function was ran 3 times"
thing(); // alerts "This function was ran 4 times"
thing(); // alerts "This function was ran 5 times"
alert(thing.banana) // alerts 5

我知道这一点,但还是谢谢你提出来,让它成为这次讨论的一部分。我利用了函数也是对象这个事实。 - Manngo

0
我从scope中提取了这个代码,并进行了修改,以便您可以学习更多技巧。请查看此示例。
<!DOCTYPE html>
<html>
<body>

<p>
In HTML, all global variables will become window variables.
</p>

<p id="demo"></p>

<script>
var apple=3;
var obj=new thing();
document.getElementById("demo").innerHTML =
"I can display " + window.apple + " and " + window.banana + " but not local " + window.orange + ". I can call this from getter though " + obj.getOrange();


function thing() {
    banana=4;
    var orange=5;

    this.getOrange = function(){
        return orange;
    }

}
</script>

</body>
</html>

输出将会是这样的。

In HTML, all global variables will become window variables.

I can display 3 and 4 but not local undefined. I can call this from getter though 5

所以,除非你为本地变量创建getter和setter,否则你将无法引用它们。全局变量将成为窗口变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接