坑一:javascript
// 反例
myname = "global"; // 全局變量
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
理解:
JavaScript中,你能夠在函數的任何位置聲明多個var語句,而且它們就好像是在函數頂部聲明同樣發揮做用,這種行爲稱爲 hoisting(懸置/置頂解析/預解析);對於JavaScript,只要你的變變量是在同一個做用域中(同一函數),它都被當作是聲明的,即便是它在var聲明前使用的時候;上面的代碼片斷執行的行爲可能就像下面這樣:
myname = "global"; // global variable
function func() {
var myname; // 等同於 -> var myname = undefined;
alert(myname); // "undefined"
myname = "local";
alert(myname); // "local"}
func();
坑二:
Function.prototype.yyyy=1; function finn() { alert(yyyy); } finn();
Function.prototype.yyyy=1; function finn() { alert(finn.yyyy); } finn();
Object.prototype.x = 10;
var w = 20;
var y = 30;
// 在SpiderMonkey全局對象裏
// 例如,全局上下文的變量對象是從"Object.prototype"繼承到的
// 因此咱們能夠獲得「沒有聲明的全局變量」
// 由於能夠從原型鏈中獲取
console.log(x); // 10
(function foo() {
// "foo" 是局部變量
var w = 40;
var x = 100;
// "x" 能夠從"Object.prototype"獲得,注意值是10哦
// 由於{z: 50}是從它那裏繼承的
with ({z: 50}) {
console.log(w, x, y , z); // 40, 10, 30, 50
}
// 在"with"對象從做用域鏈刪除以後
// x又能夠從foo的上下文中獲得了,注意此次值又回到了100哦
// "w" 也是局部變量
console.log(x, w); // 100, 40
// 在瀏覽器裏
// 咱們能夠經過以下語句來獲得全局的w值
console.log(window.w); // 20
})();
理解:javascript中,函數和函數對象區別;變量對象和活動對象區別