前端系列之 javascript作用域和閉包

2021-08-07 16:20:31 字數 1960 閱讀 5610

範圍:一段或者乙個函式

全域性:變數定義、函式宣告  

函式:變數定義、函式宣告、this、arguments

console.log(a);//undefined

var a = 100;

fn('zhangsan');

function fn(name)

在上面這段中。執行前,先把變數定義拿出來,變數a拿出來並賦值undefined;函式宣告fn拿出來,把函式體賦值給fn。所以執行到第一行的時候a是undefined。

在函式內部。先把變數定義age拿出來,賦值成undefined;this複製成fn物件,arguments複製成【name】。但是函式內第一行緊接著賦值成20了,所以age是20,name是zhangsan

function fuc(){} 函式宣告

var func = function(){} 函式表示式

fn();//不會報錯

function fn()

fn1();//會報錯

var fn1 = function ()

this要在執行時才能確認值,定義時無法確認

var a = 

}a.fn();//this === a

a.fn.call();//this ===

var fn1 = a.fn;

fn1();//this === window

作為建構函式執行

作為物件屬性執行

作為普通函式執行

js沒有塊級作用域,只有函式作用域和全域性作用域

所以在塊裡面宣告的變數和在塊外面宣告的一樣,所以盡量不要在塊裡面宣告變數。

函式裡面宣告的變數在函式外面是訪問不到的,是受保護的。

//js沒有塊級作用域

if(true)

console.log(name);

//函式作用域和全域性作用域

var a =100;

function fn()

console.log('global',a);

fn();

var a =100;

function fn()

fn();

var a =100;

function f1()

f2();

}f1();

function f1() 

}//得到乙個函式

var f1 =f1();

var a =200;

f1();

使用場景:函式作為返回值

函式作為引數傳遞

//1.函式作為返回值

//2.函式作為引數傳遞

function f1()

}//得到乙個函式

var f1 =f1();

function f2(fn)

f2(f1); //100

var i;

for(i=0;i<10;i++))

})(i)

}

自由變數

作用域鏈,即自由變數的查詢

閉包的兩個場景

stringobject.indexof(searchvalue,fromindex)

//閉包實際使用中主要用於封裝變數,收斂許可權

function isfirstload() else

}}var firstload = isfirstload();

firstload(10);//true

firstload(10);//false

firstload(20);//true

重學前端系列 Javascript物件

我們可以使用getownpropertydescriptor來檢視屬性狀態 var o o.b 2 a 和 b 皆為資料屬性 object.getownpropertydescriptor o,a object.getownpropertydescriptor o,b 複製 如果想改變屬性的特徵或者...

web前端之javaScript 迴圈總結

js原生的迴圈有兩種,一般的for迴圈和for.in迴圈。還有一種常用jquery.each 迴圈。一.js原生迴圈 a.for迴圈,如下 var myarray 1,2,3 for var i 0 i myarray.length i console 1,2,3 b.for.in迴圈,如下 var...

JavaScript系列之陣列去重

陣列去重方法是老生常談,特別是一些bat大廠的面試都會提到這個問題,既然是常談,那麼我也來談談 使用迴圈巢狀,最外層迴圈 array,裡面迴圈 res,如果 array i 的值跟 res j 的值相等,就跳出迴圈,如果都不等於,說明元素是唯一的,這時候 j 的值就會等於 res 的長度,根據這個特...