什么是作用域
作用域就是一套规则,它负责解决(1)将变量存在哪儿?(2)如何找到变量?的问题
var a=2; => var a = 2 ;(共5个单元)
function foo(str, a){
eval(str);
console.log(a, b);
}
var b=2;
foo(‘var b=3;‘,1); //1,3
var obj = {
a:1,
b:2,
c:3
};
//使用with
with(obj){
a=3;
b=4;
c=5;
}
常见的作用域单元
function是声明中的第一个词 ? 函数声明 : 函数表达式。
有无名字的区别
函数表达式可以没有名字,但是函数声明必须有名字
鼓励所有的函数都有名字
两种写法:
(function(){}());
(function(){})();//常用,第一个括号( )将函数变成表达式,第二个( )执行这个函数
变量的声明离使用的地方越近越好,并最大程度的本地化。
foo();//Uncaught TypeError: foo is not a function//foo()对于undefined值进行函数调用而导致非法操作
var foo= function bar(){
console.log(‘1‘);
};
foo();//1
foo;//function bar(){}
bar;//ReferenceError: bar is not defined
bar();//ReferenceError: bar is not defined
function foo(a) {
var b=a;
return a+b;
}
var c= foo(2);
答案:
LHS(3处) c=..., a=2(隐式变量分配),b=...,
RHS(4处) foo(2..., =a, a.., ..b
闭包 = 那些能够访问自由变量的函数 = 函数 + 函数能访问的自由变量
自由变量 = 在函数中使用,但既不是函数参数也不是函数的局部变量
for(var i=1;i<=5;i++){
setTimeout( function timer(){
console.log(i);
},i*1000);
} //以每秒一次的频率输出5个6
for(var i=1;i<=5;i++){
(function(j){
setTimeout( function timer(){
console.log(j);
},j*1000);
})(i);
} //立即执行函数为每一次迭代生成一个新的作用域,以每秒一次依次输出1-5
for(let i=1;i<=5;i++){
setTimeout(function timer(){
console.log(i)
},i*1000);
}
原文:https://www.cnblogs.com/hiluna/p/9736376.html