目錄
第一題:
第二題:
第三題:
第四題:
第五題:
第六題:
第七題:
目前就收集了這些,望共勉之!!
第一題:
var a = 10;
(function a(){
console.log(a)
a = 20;
console.log(window.a)
var a = 30
console.log(a)
})()
等同于一下代碼:
var a = 10;
(function a(){
//內部作用域
var a;//var a = 30 中的宣告被提升
console.log(a)//undefined
a = 20;//內部作用域的a賦值20
console.log(window.a)//window中的a依然是10
a = 30//內部作用域的a賦值30
console.log(a)//列印內部作用域中的a 30
})()
第二題:
var name = '張三';
function fn() {
if (typeof name === 'undefined') {
var name = '李四';
console.log('辛苦了: ' + name);
} else {
console.log('吃飯沒: ' + name);
}
}
fn();
等同于:
var name = '張三';
function fn() {
var name ;// var name = '李四'; 中的宣告被提前到函式作用域里面
if (typeof name === 'undefined') {//此時成立
name = '李四';
console.log('辛苦了: ' + name);
} else {
console.log('吃飯沒: ' + name);
}
}
fn();
第三題:
var a=10,b=20,c=30;
function fn(a){
a=1;
var b=2;
c=3
}
fn(100)
console.log(a,b,c);
等同于如下代碼:
var a=10,b=20,c=30;
function fn(a){
//函式呼叫,形成區域作用域,形參a在內部區域作用域 a=100
var b;//b在內部變數提升
a=1;//內部區域作用域 a設定為1
b=2;//內部區域作用域 b設定為2
c=3;//全域作用與c被設定值3
}
fn(100)
//可以看到只有c被區域作用域修改了
console.log(a,b,c);//10 20 3
第四題:
if(!("a" in window)){
var a = 10
}
console.log(a);
等同于:
var a;//變數提升了
if(!("a" in window)){//"a" in window 成立了,所以這個條件不執行
a = 10
}
console.log(a);//'undefined
第五題:
var fn = 'hello';
(function(fn){
console.log(fn);
var fn=fn||'world';
console.log(fn)
})(fn)
console.log(fn);
等同于:
var fn = 'hello';
(function(fn){
//內部作用域
//形參先被定義 所以fn=hello
//var fn;//var fn=fn||'world';變數提升到這里,但是會被忽略,因為形參的fn先被定義
console.log(fn);//列印hello
fn=fn||'world';//這句fn還是等于hello
console.log(fn)//列印hello
})(fn)//hello作為實參傳入
console.log(fn);//列印hello
//最終結果是:hello hello hello
第六題:
var n=10;
function fn(n){
console.log(n);
var n= 20;
console.log(n);
function n(){
}
console.log(n);
}
fn(n);
console.log(n);
等同于:
var n=10;
function fn(n){
//區域作用域
//n根據形參首先定義 n=10
//函式會提升,覆寫了n,此時n為函式
function n(){
}
//var n;//var n =20中的var n 被提升到此處,但是會被忽略
console.log(n);//列印函式
n= 20;//n被賦值為20
console.log(n);//列印20
//函式已經提升
console.log(n);//列印20
}
fn(n);//實參n=10傳入呼叫
console.log(n);//列印10
第七題:
function fn(fn){
console.log(fn);
var fn = 20;
console.log(fn);
function fn(){
console.log(fn);
}
}
fn(30);
var fn = 10;
console.log(fn);
等同于:
function fn(fn){
//區域作用域 fn被形參設定 fn為30
function fn(){//函式被提升到此次,并且fn設定為函式
console.log(fn);
}
var fn ;//var fn = 20;中的var變數提升到這里,但是會被忽略
console.log(fn);//列印函式
fn = 20;//賦值20
console.log(fn);//列印20
}
var fn;//var fn = 10;這句中的var變數提升到這里,但是會被忽略,因為已經存在函式 fn 了
fn(30);//執行函式
fn = 10;//賦值fn為10
console.log(fn);//列印10
最侄訓依次列印出:fn函式 20 10
目前就收集了這些,望共勉之!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/241032.html
標籤:其他
