JavaScript中的变量范围是什么? [英] What is the scope of variables in JavaScript?
问题描述
javascript中的变量范围是什么?它们的内部是否与函数外部相同?或者甚至重要吗?另外,如果变量是全局定义的,那么它们存储在哪里?
What is the scope of variables in javascript? Do they have the same scope inside as opposed to outside a function? Or does it even matter? Also, where are the variables stored if they are defined globally?
推荐答案
我认为我能做的最好的就是给你一个一堆例子来研究。
Javascript程序员实际上根据他们理解范围的程度来排名。
它有时可能非常违反直觉。
I think about the best I can do is give you a bunch of examples to study. Javascript programmers are practically ranked by how well they understand scope. It can at times be quite counter-intuitive.
-
全局范围的变量
// global scope
var a = 1;
function one() {
alert(a); // alerts '1'
}
本地范围
// global scope
var a = 1;
function two(a) { // passing (a) makes it local scope
alert(a); // alerts the given argument, not the global value of '1'
}
// local scope again
function three() {
var a = 3;
alert(a); // alerts '3'
}
中级:没有JavaScript中的块范围(ES5; ES6引入 让
)
Intermediate: No such thing as block scope in JavaScript (ES5; ES6 introduces let
)
a。
var a = 1;
function four() {
if (true) {
var a = 4;
}
alert(a); // alerts '4', not the global value of '1'
}
b 。
var a = 1;
function one() {
if (true) {
let a = 4;
}
alert(a); // alerts '1' because the 'let' keyword uses block scoping
}
中级:对象属性
var a = 1;
function Five() {
this.a = 5;
}
alert(new Five().a); // alerts '5'
高级:关闭
var a = 1;
var six = (function() {
var a = 6;
return function() {
// JavaScript "closure" means I have access to 'a' in here,
// because it is defined in the function in which I was defined.
alert(a); // alerts '6'
};
})();
高级:基于原型的范围解析
var a = 1;
function seven() {
this.a = 7;
}
// [object].prototype.property loses to
// [object].property in the lookup chain. For example...
// Won't get reached, because 'a' is set in the constructor above.
seven.prototype.a = -1;
// Will get reached, even though 'b' is NOT set in the constructor.
seven.prototype.b = 8;
alert(new seven().a); // alerts '7'
alert(new seven().b); // alerts '8'
全球+本地:一个额外的复杂案例
var x = 5;
(function () {
console.log(x);
var x = 10;
console.log(x);
})();
这将打印出 undefined
和 10
而不是 5
和 10
因为JavaScript总是移动变量声明(未初始化)到范围的顶部,使代码等效于:
This will print out undefined
and 10
rather than 5
and 10
since JavaScript always moves variable declarations (not initializations) to the top of the scope, making the code equivalent to:
var x = 5;
(function () {
var x;
console.log(x);
x = 10;
console.log(x);
})();
Catch子句范围变量
var e = 5;
console.log(e);
try {
throw 6;
} catch (e) {
console.log(e);
}
console.log(e);
这将打印出 5
, 6
, 5
。在catch子句中 e
隐藏全局变量和局部变量。但是这个特殊范围仅适用于捕获的变量。如果在catch子句中写入 var f;
,那么它与在try-catch块之前或之后定义它的方式完全相同。
This will print out 5
, 6
, 5
. Inside the catch clause e
shadows global and local variables. But this special scope is only for the caught variable. If you write var f;
inside the catch clause, then it's exactly the same as if you had defined it before or after the try-catch block.
这篇关于JavaScript中的变量范围是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!