什么是做用域
做用域就是一套规则,它负责解决(1)将变量存在哪儿?(2)如何找到变量?的问题ajax
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); }