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 函式作用域...