作用域是什麼呢? 它是指的**在執行時,變數、函式或者物件的可訪問性?還是乙個變數和函式的作用範圍?又或是如《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...