什麼是做用域
做用域就是一套規則,它負責解決(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); }