变量提升细节知识点
1.return 后面不进行变量提升,但是return下面的还是要
变量提升
2.重名变量不会重复声明,但是会重复赋值
3.自执行函数本身不进行变量提升;自执行函数 = 定义+执行一起操作
4.if条件下,不管条件是否成立,对带var关键字的进行声明 对function关键字,标准浏览器只声明不定义,IE浏览器下是声明+定义
第一题
var ary=[10,30,50];
function fn(n){
n.push(40);//n=[10,30,50,40]
alert(n);
n=[];//n=[] 等于一个新的引用地址
n[n.length]=100;//n = [100]
console.log(n)//[100]
}
fn(ary)
alert(ary);//[10,30,50,40]
第二题
var n=13;
function fn(n){
alert(n);//13
n=14; // 实参n=14
alert(n);//14
}
fn(n);
alert(n)//13
第三题
var n=0;
function a(){
var n=10;
function b(){
n++;//n=11
alert(n);//11
}
b();
}
a();//11
alert(n);//0
第四题
console.log(num,str);//undefined undefined
var num = 18;
var str = "lily";
function fn2(){
console.log(str,num);//"lily" undefined
num = 19;
str = "candy";
var num = 14;
console.log(str,num);//"candy" 14
}
fn2();
console.log(str,num);//"candy" 18
第五题
fn();//2
function fn(){console.log(1)};
fn();//2
var fn = 13;
fn();//fn = 13; fn is not a function 报错 下面代码不执行
function fn(){console.log(2)};
fn();
第六题
~(function f(){ // f 声明加重复定义 console.log(2)
function f(){console.log(1)};
f();//2
function f(){console.log(2)};
})();
第七题
if(!("a" in window)){
var a = 10;
}
alert(a);//if条件下 a声明未定义,条件不成立 undefined
console.log(fn);//fn声明未定义, 条件不成立 undefined
if(9==8){
function fn(){
alert(2);
}
}
第八题
f = function(){return true};
g = function(){return false};
(function (){ //g声明未定义
if(g()&&[]==![]){ // g() g is not a function
//报错 下面代码不执行
f = function f(){return false};
function g(){return true};
}
})();
alert(f());
alert(g())
第九题(画图一目了然)
function fn(){ //FFF000 return的地址被占用,作用域不销毁
var i=5;
return function(n){ // FFF111
console.log(n*i++);
}
}
var f=fn();//FFF111
f(4);// 4*5=20
fn()(5);//5*5=25 开辟一个新的私有作用域
f(6);//6*6=36 不销毁作用域里的i变成了6
第十题(画图一目了然)
var i=3;
function fn(){
i*=2;
return function(n){
console.log(n*(++i))
}
}
var f=fn();
f(3);//同第九题 作用域是否销毁 3*(2*3+1)=21 ; i=7
fn()(3);//3*(7*2+1)=45 ; i=15
f(4);//4*(15+1)=64 ; i =16;
fn()(3);//3*(16*2+1)=99 ; i=33
第十一题
var name='珠峰';
var age=300;
name=(function(name,age){
arguments[0]='珠峰培训';//name='珠峰培训'
age=age && this.age;//age实参未传入 undefined
console.log(name,age);//'珠峰培训' undefined
})(name);
//全局下的name就等于这个function
//但是没有return接收返回值 所以是undefined
console.log(name,age)//undefined 300
第十二题
var num = 3;
var obj = {
num:5,
fn : (function(){
this.num*=2;
var num = 4;
return function(){
this.num *=2;
num *= 4;
alert(num);
}
})()
}
var fn = obj.fn;
alert(num);
fn();
obj.fn();
console.log(window.num,obj.num);