JS变量提升问题(及一些作用域面试题)
2016-11-24 00:00
561 查看
摘要: 变量提升
变量声明提升的作用在一个函数体内声明的变量,JS解析器都会将其移动到函数体的顶部
等价为==>
执行的时候有个变量查找的过程,如果在当前函数体内没找到,就会到定义的函数体的外层函数中去寻找,一直向上到全局对象中寻找,还是找不到就会报
以上代码就表现为这种行为~~
2、函数同名情况提升
3、变量名和函数同名的情况(结论:如果出现变量和函数同名的情况,则在进行提升的时候,只会提升函数到当前作用域顶端而忽略变量的提升操作)
********************************************************************************
变量提升和作用域笔试题 1、
2、
3、
4、
5、
6、in 关键字 判断某个对象中是否有某个属性
7、
8、
变量声明提升的作用在一个函数体内声明的变量,JS解析器都会将其移动到函数体的顶部
var name = 'World!'; (function () { if (typeof name === 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })(); //Goodbye Jack
等价为==>
var name = 'World!'; (function () { var name; if (typeof name === 'undefined') { name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })();
执行的时候有个变量查找的过程,如果在当前函数体内没找到,就会到定义的函数体的外层函数中去寻找,一直向上到全局对象中寻找,还是找不到就会报
TypeError错误
var name = 'World!'; (function () { console.log(name) // World! })();
以上代码就表现为这种行为~~
2、函数同名情况提升
func01(); //打印last function func01() { console.log("first"); } func01(); //打印last function func01() { console.log("last"); } //模拟提升后的情况 function func01() { console.log("first"); } function func01() { console.log("last"); } func01(); func01();
3、变量名和函数同名的情况(结论:如果出现变量和函数同名的情况,则在进行提升的时候,只会提升函数到当前作用域顶端而忽略变量的提升操作)
console.log(a); //打印function function a() { console.log("我是一个函数"); } var a = 20; console.log(a); //打印20 //变量和函数提升后的结果 错误 // function a() { // console.log("我是一个函数"); // } // var a ; // console.log(a); // a = 20; // console.log(a); //变量和函数提升后的结果 正确 function a() { console.log("我是一个函数"); } console.log(a); var a = 20; console.log(a);
********************************************************************************
变量提升和作用域笔试题 1、
// f1(); // console.log(b); // console.log(c); // console.log(a); // function f1(){ // var a = b = c = 9; // console.log(a); // 9 9 9 9 9 (not define) // console.log(b); // 原因只有a是局部变量 // console.log(c); // b,c都是全局变量 // }
2、
/*f2(); console.log(a); console.log(b); console.log(c); function f2(){ var a = 9,b = 9,c = 9; console.log(a); // 9 9 9 (not define) console.log(b); // 原因a,b,c都是局部变量 console.log(c); console.log(c); }*/
3、
/* var num = 1; function f3(){ console.log(num); // 1 全局变量影响 num = 2; } f3();*/
4、
/*var num = 1; f4(); function f4(num){ console.log(num);// undefine 有形参的情况并且 num = 2; //没有传实参默认传空值 }*/
5、
/*var num = 1; f5(num); function f5(num){ console.log(num);// 1 参数影响 num = 2; }*/
6、in 关键字 判断某个对象中是否有某个属性
function f1(){ var a; if("a" in window){ var a = 10; } alert(a); // 10 } f1();
if("a" in window){ var a = 10; } alert(a); // 10 //预解析 var a; if("a" in window){ a = 10; } alert(a);
var a; if(!"a" in window){ a = 10; } alert(a); // undefined
7、
var foo = 1; function bar() { if(!foo) { var foo = 10; } alert(foo); } bar(); // 10 // // //提升后的代码 // var foo; // function bar(){ // var foo; // if(!foo) { // foo = 10; // } // alert(foo); //??10 // } // foo = 1; // bar();
8、
function Foo() { getName = function(){ alert(1); }; return this; } Foo.getName = function() { alert(2); }; Foo.prototype.getName = function(){ alert(3); }; var getName = function() { alert(4); }; function getName(){ alert(5); } Foo.getName(); // 2 getName(); // 4 Foo().getName(); // 1 --> 使this指向window,Foo()函数的getName也就是window的属性 getName(); // 1 new Foo.getName(); // 2 --> new (Foo.getName()); new Foo().getName(); // 3 --> (new Foo()).getName(); new new Foo().getName(); // 3 --> new 3 = 3
相关文章推荐
- JS一起学03:js组成、下拉+text、字符串拼接、分号问题、数据类型、变量类型、作用域和闭包、命名、运算符、流程判断、调试、iNow、onchang
- 有关js的变量、作用域和内存问题
- JS-作用域与变量声明提升
- 关于JS变量提升的一些坑
- JS变量、作用域和内存问题
- js笔记四:变量、作用域和内存问题
- js-变量、作用域和内存问题,引用类型
- 【每天学3章,一周掌握js】第4章:变量、作用域和内存问题
- 【JS】变量、作用域和内存问题
- 《JavaScript高级程序设计》第4章 js中的变量、作用域和内存问题
- JS学习笔记(二)变量、作用域及内存问题
- JS高级程序设计第三版——变量、作用域和内存问题
- js变量、作用域和内存问题
- js 变量,作用域和内存的问题
- js高程第四章 变量、作用域和内存问题------学习笔记
- 四、变量、作用域及内存问题[js笔记]
- js高级程序设计(四)变量、作用域和内存问题
- H5基础知识第十一课时(JS解决变量自提升问题)
- js中变量作用域问题
- 关于js语法中的一些难点(预解析,变量提前,作用域)