變數提升
var宣告的變數會提升到函式或全域作用域頂部
簡單例子
// 全域作用域變數提升例子
console.log(b) // undefined
var b = 4
// 提升之后是這樣
var b;
console.log(b) // 所以 b 沒有值
b = 4
// 函式作用域中變數提升
var b = 5
function test() {
console.log(b) // undefined
var b = 4
}
// 變數提升之后
var b = 5
function test() {
var b
console.log(b) // 所以這里變數b 沒有賦值 undefined
b = 4
}
函式提升
函式寫法:函式運算式、函式宣告、Function建構式(這種不推薦).其中函式運算式不會函式提升,函式宣告會函式提升,
// 在這例子中 var b 宣告的變數會提升,匿名函式不會.
var b = function() {
//...
}
// 提升之后
var b ;
b = function(){}
我們都知道程式在執行時是從上往下執行的,而這里test()在定義之前就呼叫了為什么不報錯?
// 在編譯階段所有的函式宣告都會被提升到頂部.所以這里可以在定義之前使用函式
test()
function test() {
console.log('ss')
}
// 提升之后
function test() {
console.log('ss')
}
test()
實體一
num 值為多少?
var foo = function(x, y) {
return x - y;
};
function foo(x, y) {
return x + y;
}
var num = foo(1, 2); // -1
根據函式提升原理可得提升之后
// 函式提升之后代碼
function foo(x, y) {
return x + y;
}
var foo = function(x, y) { // 在這里 foo 函式被重寫了
return x - y;
};
var num = foo(1, 2); // -1
實體二
y和z的最終結果為: ?
var m = 1,
j = (k = 0);
function add(n) {
return (n = n + 1);
}
y = add(m);
function add(n) {
return (n = n + 3);
}
z = add(m);
這例子也是一樣的函式提升,只要把提升之后的代碼貼出來就能知道結果了
// 函式提升之后 如下:
function add(n) {
return (n = n + 1);
}
function add(n) { // js中沒有函式多載,這只是覆寫了上面定義的add函式
return (n = n + 3); // 相加完之后賦值給n 然后回傳n
}
var m = 1,
j = (k = 0); // k 是一個非定義變數,在嚴格模式下是錯誤的.
y = add(m); // 4
z = add(m); // 4
實體三
控制臺列印結果是什么?
var b = 5;
(function test(b) {
console.log(b);
var b = 10;
})(b);
console.log(b);
這里涉及了變數提升和引數與函式內部變數重復宣告2個知識點
// 變數提升之后
var b = 5;
(function test(b) {
var b; // 這里是無效的,引數名與內部變數宣告重復的情況下,重復宣告是無效的.
console.log(b); // 5
b = 10;
})(b); // 引數傳遞
console.log(b); // 5
實體四
這題為實體三變種型別,主要考察參考型別
var b = {
x: 5
};
(function test(b) {
console.log(b.x); // 5
var b = { x: 10 };
console.log(b.x) // 10
})(b);
console.log(b.x); // 5
參考型別傳遞的是指標,指標指向了變數存盤地址.這例子里,2個b變數都指向了同一個地址,所以第一次輸出5,然后下面修改了函式內部變數b的指向,它指向了一個新的存盤地址,這里輸出的是10.全域變數b的指向并沒有變,所以這里輸出的依然是5
個人博客地址 : https://www.zhuamimi.cn
文章地址 : https://www.zhuamimi.cn/archives/201
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/148156.html
標籤:JavaScript
上一篇:url相對路徑變成絕對路徑
