深入淺出JS 作用域

2021-09-24 07:08:38 字數 1977 閱讀 2942

作用域是什麼呢? 它是指的**在執行時,變數、函式或者物件的可訪問性?還是乙個變數和函式的作用範圍?又或是如《know js》中所說的作用域是根據名稱查詢變數的一套規則呢,又或是指的當前**的執行環境

在筆者的眼裡,作用域所指的是規則,一套用來管理變數和函式的作用範圍的規則。

var userinfo = 'a';

// 作用域是約束作用範圍的規則

function foo()

foo();複製**

在作用域的規則之下這串**執行良好,可是沒有作用域時呢?外部的userinfo和內部的userinfo互相衝突,還是互相覆蓋?我們不得而知。

// 假設不存在作用域, 我們所有的變數都變得混亂了

var userinfo = 'a'

function

foo()

function

log()

}foo();

複製**

作用域限制變數的可見性,解決不同範圍內的同名變數命名問題。so它是一套規則。在程式語言裡會有作用域其實就是為了限制變數的可見性。

作用域為我們的**提供了乙個安全層級,某個作用域內的變數對外部是不可見的,保證了內部變數的安全性,同時作用域也為js引擎在編譯階段提供依賴於詞法作用域的優化,它還解決了不同範圍內的同名變數問題。

function foo(str, a) 

var b = 2;

foo("var b = 3;", 1);

function baz(obj)

}var o1 =

var o2 =

baz(o1);

console.log(o1.a) // 2

baz(o2);

console.log(o2.a); // undefined

console.log(a); // 2 在全域性作用域內建立了乙個變數複製**

在非嚴格模式下,eval和with都會在執行時,修改或建立新的作用域。使得js引擎在編譯階段無法預先確定所有變數和函式的定義位置。沒法進行依賴於詞法分析的優化。

巢狀作用域的規則很容易理解,當我們使用(解析)乙個變數時,如果沒有在當前作用域找到該變數時,就會向上一級作用域繼續查詢,一直到全域性作用域。無論找到還是沒找到,查詢過程都會停止。這種通過巢狀作用域的關係來查詢變數的行為就叫作用域鏈。

var b = 'leaf';

function

foo() )();

}foo();

var b = 'leaf';

function

foo() )();

}foo();複製**

let num = (function

() })();

num(); // 1

num(); // 2

num(); // 3

let obj = function

(){};

(function

()

obj.prototype.say = function

() ;

})();

var ins = new obj();

ins.say(); // 10

ins.say(); // 11

ins.say(); // 12

let m1 = (function

()

function

_p2()

return

})();

複製**

《you don't know js》

js深入淺出 型別轉換

隱式轉換 1.是賦值 2.嚴格模式 先判斷型別,再判斷值 console.log 123 123 false console.log null undefined false console.log undefined undefined true 3.如圖 2.一邊是數值,一邊是字串,字串會轉數值...

JS 深入淺出This指向(精簡)

首先我們圍繞耳熟能詳的 this始終指向它的呼叫者 開始。這句結論雖然沒有什麼問題,但是說得過於籠統,還是得深入到背後的執行原理才能舉一反三解決問題。舉個簡單的例子 var obj var foo obj.foo var num 3 obj.foo 2 foo 3 obj.foo 是物件obj呼叫自...

深入淺出sizeof

int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...