總結函式宣告提公升,閉包,作用域,this

2021-08-11 07:13:25 字數 2048 閱讀 2840

js作用域鏈

var n = 120;

function a()

a();//100

function b()

b();//120

function c()

//100,注意:不加var是乙個全域性變數/*function a()

console(n);*/

在函式外部找函式內部變數,找不到

/*function a()

console(n);//會報錯!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/

函式宣告提公升

/*var a = 18;

function f1()

f1();//從這個例子告訴我們函式宣告提公升,我們可以理解為執行f1()時,提前宣告var a,b;當console.log(a);時,a已被定義未被賦值所以列印出undefined*/

因為js的函式都是乙個個小黑屋,函式內部可以看到外部的變數,函式外部不能看到函式內部的變數。通俗易懂的理解就是函式內部的函式,來讓外部引用內部的變數。這樣做的好處是更好的實現函式封裝。

function a()

return b;

}var c = a();

c(); // 0

/*匿名函式var a = (funcion(){})();

第乙個()中是匿名函式,如果有返回值,則把返回值賦給a;

第二個()中是要給匿名函式傳遞的引數;*/

var a = (function ())(a);

console.log(a);//a=2;

var b=5;

var a = (function())(b);

console.log(a);//a=6

var a = (function())();

console.log(a);//a=1

var a = (function())();

console.log(a);//a=undefind

首先在js中this是誰呼叫他,他就指向誰。比如在瀏覽器環境裡,全域性變數this指向的是window。

瀏覽器渲染機制

head中的指令碼會在頁面載入之前解析,可以保證指令碼在任何呼叫之前被載入 

body中會在頁面載入完成之後讀取,放在body部分的指令碼通常被用來生成頁面的內容。 因為載入js指令碼會阻塞頁面的載入,為了使用者體驗也為了指令碼可以操作dom,一般放在body中, 瀏覽器解析html是從上到下的。 如果把js放在head裡的話,則先被解析,但這時候body還沒有解析,所以會返回空值。一般都會繫結乙個監聽,當全部的html文件解析完之後,再執行**: 

windows.οnlοad=function()

var num =20;

var obj=

})(num)

};var fn=obj.fn;

fn();

obj.fn();

console.log (window.num) ;

console.log(obj.num) ;

console結果為???

因為執行fn()時return的匿名函式console.log的是num,這是誰指向他,他就呼叫誰的num。這時num為45.num+20=65。

所以當obj.fn()執行時,num+20=65+20=85。

第一次fn()執行,this指向的是window,this.num就為20,執行*3,再執行*4就為24。

第二次執行obj.fn(),this指向的obj,此時this.num為30。執行return裡面*4,所以為120。

最後console.log(window.num);為240

console.log(obj.num);為120

閉包 函式 作用域

指有權訪問另乙個函式作用域中的變數的函式 要理解閉包就必須要了解作用域鏈 後台的每個執行環境都有乙個表示變數的物件 變數物件。全部變數物件始終都存在 而像compare 函式這樣的區域性環境的變數物件,則只在函式執行的過程中存在 在建立compare 函式的時候,會建立乙個預先包括全域性變數物件的作...

作用域 提前宣告和閉包

在es6之前,只有全域性作用域和函式作用域,es6的let和const讓塊級作用域成為可能 全域性作用域 全域性作用域是最大的最根本的作用域,在它上面宣告的變數是全域性變數,可以在任何地方被訪問的,只要沒有被變數覆蓋 函式作用域 存在於函式呼叫的時候,在函式中所有宣告的變數,只有在函式被呼叫的時候才...

作用域 閉包

1.js執行順序 語法分析 預編譯 先生成go物件 1.函式執行生成ao物件 2.形參和變數作為ao物件的鍵名,鍵值是undefined 3.實參賦值給形參 4.在函式中找到函式宣告,把函式作為ao物件的屬性名,屬性值為函式體 執行js 作用域 變數作用範圍 1.作用域 變數作用範圍 1 函式作用域...