如果在作用域内没有宣告,变数就会往外层的作用域找看看有没有宣告,全域都没找到,就会在全域的最开端进行宣告,也就是说如果在作用域里面没有宣告的变数就会变成全域变数。
建议在开发ES6之後的专案中,使用“ const ”或者“let”严谨的宣告变数而非“var”,除了让开发的专案更加稳定外,也可以增加程序码的可读性。
回答出为何出现下列状况:
1.第二个console.log(i)为何为3
for(var i=0; i<3; i++){
console.log(i,"Hi");
// 依次出现 0 "Hi"、1 "Hi"、2 "Hi"
}
console.log(i);
// 出现3
Ans:因var是函式作用域,故污染全域下的i
2.为何出现错误
let a = 6;
let a = 20;
console.log(a);
//出现错误:Identifier 'a' has already been declared
var a = 6;
let a = 20;
console.log(a);
//出现错误:Identifier 'a' has already been declared
Ans:因let无法在同一层 Block 重复宣告变数(即使另一个是用 var 宣告的变数也不行)
3.为何const能够重新赋值
const myObj = {
url: "http://123.com"
}
myObj.url = "changed";
console.log(myObj.url); // changed
Ans:因为在 JS 中阵列和物件都是属於 reference type,在修改时并没有把这个常数指向其他地方,故可更改
console.log(a)个别的值
var a = 5;
(function(){
var a = 30 ;
console.log(a);
})();
console.log(a);
if(a !== 0 ){
var a = 10;
};
console.log(a);
第一个console.log(a)--->在立即函式里,为函式作用域,故为30。
第二个console.log(a)--->在全域里,故为5。
第三个console.log(a)--->在区块作用域里,故全域污染,故为10。
3.必刷热门面试题
function sayHi() {
var a = 'Mary';
a = 'Tom';
}
var a = 'Casper';
sayHi();
console.log('Hello' + ' ' + a); //"Hello Casper"
function sayHi() {
a = 'Tom';
}
var a = 'Casper';
sayHi();
console.log('Hello' + ' ' + a); // "Hello Tom"因sayHi()里的a无宣告,故污染全域变数
function sayHi() {
a = 'Tom';
var a = "sam";
function sayho(){
a = "ohmygod"
};
sayho();
}
var a = 'Casper';
sayHi();
console.log('Hello' + ' ' + a); //Hello Casper
function sayHi() {
a = 'Tom';
function sayho(){
a = "ohmygod"
};
sayho();
}
var a = 'Casper';
sayHi();
console.log('Hello' + ' ' + a); //Hello ohmygod
<<: 写在VSCode Extension系列文之後 - 12th铁人赛颁奖典礼得奖致词
>>: Python 演算法 Day 7 - 理论基础 统计 & 机率
这篇会讲解怎麽直接用 jUnit 来测试 parser 和 Android 环境的 parser ,...
大家好,今天来教大家如何配置文件。 首先 首先,先确认您已经将系统更新到Big Sur以上(避免出现...
(注:昨天不小心把Reset按钮的type改成button,今天改回reset。) 我们目前建立了3...
tags: Vuejs 具名插槽 ✐ 若是需要多个插槽,可以在 <slot> 中使用 n...
哈罗~ 昨天我们用msfvenom建立了一个後门, 将其传送到受害端的主机, 只要受害端运行了该程序...