JavaScript 中 this 的指向取決于函數(shù)調用方式,獨立函數(shù)調用時,非嚴格模式指向全局對象,嚴格模式為 undefined。this 的指向可能在回調函數(shù)或事件處理中因調用環(huán)境變化而改變。理解 this 的關鍵在于明確函數(shù)的調用上下文,避免因隱式綁定或默認綁定導致預期外的行為。
一、JavaScript 中 this 的指向規(guī)則
在 JavaScript 中,this 的指向取決于函數(shù)的調用方式,主要分為以下 5 種情況:
1. 默認綁定
非嚴格模式下,this 指向全局對象(瀏覽器中為 window,Node.js 中為 global)。
嚴格模式下,this 為 undefined。
javascriptfunction foo() {console.log(this); // 瀏覽器: window | 嚴格模式: undefined}foo();
2. 隱式綁定
當函數(shù)作為對象的方法調用時,this 指向調用該方法的對象。
javascriptconst obj = {name: "Alice",greet() {console.log(this.name); // "Alice"}};obj.greet();
3. 顯式綁定
通過 call、apply 或 bind 強制指定 this。
javascriptfunction greet() {console.log(this.name);}const user = { name: "Bob" };greet.call(user); // "Bob"const boundGreet = greet.bind(user);boundGreet(); // "Bob"
4. new 綁定
使用 new 調用構造函數(shù)時,this 指向新創(chuàng)建的對象實例。
javascriptfunction Person(name) {this.name = name;}const alice = new Person("Alice");console.log(alice.name); // "Alice"
5. 箭頭函數(shù)
箭頭函數(shù)的 this 繼承自外層作用域,無法通過調用方式改變。
javascriptconst obj = {name: "Charlie",greet: () => {console.log(this.name); // 取決于外層 this(如 window.name)}};obj.greet(); // 可能為 undefined(除非外層定義了 name)
二、JavaScript 中 var 的用法及特點
var 是 ES5 及之前的變量聲明方式,具有以下特性:
1. 函數(shù)作用域
var 聲明的變量作用域為整個函數(shù)(而非塊級作用域)。
javascriptfunction test() {if (true) {var x = 10;}console.log(x); // 10(未被塊級限制)}
2. 變量提升(Hoisting)
var 會在代碼執(zhí)行前被提升到作用域頂部。
javascriptconsole.log(y); // undefined(不會報錯)var y = 20;
3. 可重復聲明
同一作用域內可重復聲明同一變量。
javascriptvar z = 1;var z = 2; // 合法,z 被覆蓋
4. 無暫時性死區(qū)(TDZ)
與 let/const 不同,var 在聲明前訪問不會觸發(fā) TDZ 錯誤。
5. 全局變量污染
在非函數(shù)作用域中使用 var 會創(chuàng)建全局變量。
javascriptif (true) {var globalVar = "oops";}console.log(window.globalVar); // "oops"(瀏覽器中)
現(xiàn)代替代方案
優(yōu)先使用 let(塊級作用域)和 const(常量),避免 var 的副作用。
javascriptconst a = 1; // 不可重新賦值let b = 2; // 塊級作用域
總結
this 指向需結合調用方式判斷,箭頭函數(shù)除外。
var 已逐漸被 let/const 取代,但在舊代碼中仍需理解其行為。
在JavaScript中,`this`的指向取決于函數(shù)的調用方式。在JavaScript中,this關鍵字的指向取決于其所在的上下文環(huán)境,特殊情況是 箭頭函數(shù),其 this 繼承自外層作用域,且無法通過調用方式改變。