前端筆記四 預解析、作用域、this關鍵字
預解析
個人定義:js代碼執行之前,會在相應的執行環境中,預先把一些東西解析到內存。
正式執行前,解析 var function 等定義,只有變量和函數才會發生變量提升,只是提升聲明不會賦值。
預解析哪些東西: var 、function.
預解析順序:
1.首先找到<script>...</script>標簽,按照<script>塊依次解析。不會出現跨塊解析的情況。
2.解析執行環境。首先解析的是全局作用域範圍,當執行函數時,才會進入函數的解析執行環境。
3.對標識符 var 、function 進行解析。說明function的優先級高於var。
function example5() {
var f = function() {return 1;};
function f() {return 2;};
return f;
}
var a5 = example5();
alert(a5()); //1
解析為:
function example5() {
var f; // function聲明
var f; // var聲明
f = function f() {return 2;}; // function賦值
f = function() {return 1;}; // 等號賦值
return f;
}
var a5 = example5();
alert(a5());
預解析通常就是我們常說的聲明提前。
作用域: 個人理解為預解析中的解析執行環境。
分為全局作用域、函數作用域(函數內部)、塊級作用域({}大括號內部)
註意var 屬於函數作用域,let屬於塊級作用域。
//4種形式 var a = 1; function fn1(){ console.log(a); } fn1(); //輸出1function fn1(){ var a = 1; } fn1(); console.log(a) //報錯
var a = 1; function fn1(){ console.log(a); a = 2; } fn1(); console.log(a) //輸出 1,2
var a = 1; function fn1(){ console.log(a); var a = 2; //全局變量和局部變量同名時,全局變量的不會作用於同名局部變量的作用域 } fn1(); console.log(a) //輸出 undefined, 1 this關鍵字: //在簡單函數中使用 function fu(){ //"use strict" console.log(this); //window,嚴格模式下為undefined } //在對象的方法中 var obj = { name: abc, action :function(){ this.name; //this表示當前obj對象 }, msg : fu //當使用外部對象時,this不在指向window,而是obj。 } //在構造函數中 function Fn(name,color){ this.name = name; this.color = color; } var f1 = new Fn("abc","red"); //this指向當前實例化的對象
//改變this的指向 apply() 數組為參數,call()對象為參數 1.33分鐘 var name = "yanpin"; var obj = { name: "abc", action:function() { console.log(this.name) } }; console.log(obj.action.call()); //不傳參數,默認window,輸出name console.log(obj.action.call(obj)); //this指向obj
前端筆記四 預解析、作用域、this關鍵字