js变量声明提升&undefined
2016-09-28 15:04
211 查看
变量和函数的定义提升你可能都知道,但在实际碰到的时候可能会忽视。下面看一个例子:
var getName = function(){return 2};//函数表达式
function getName(){return 4};//函数声明
console.log(getName());//2
再看另一个例子
console.log(getName());//4
var getName = function(){return 2};//函数表达式
function getName(){return 4};//函数声明
原因:我们知道变量的声明会得到提升,就是说即使我们在代码的最后一行定义了一个变量,也像在代码顶部声明过一样,即使在我们定义前访问它,也不会报错。例:
console.log(a);//undefined
var a = 1;
这里没有报错,而是显示undefined。我们要弄清楚,只是声明得到了提升。声明和定义的差别,声明是这样:var a,即我们声明了a,但没有给他赋值。定义是这样:var a = 1,我们给他具体的值。
再回头看前两个例子,用函数声明的方式定义的函数,声明(命名)和定义都会得到提升。而用函数表达式的方法定义的函数,只有声明会得到提升。所以第一个就例子相当于:
var getName;//函数表达式的提升
function getName(){return 4}; //以函数声明方式命名的函数获得的提升
var getName = function(){return 2};
console.log(getName());//2
而第二个例子就相当于:
var getName;
function getName(){return 4};
console.log(getName());//4
var getName = function(){return 2};
还有一点关于undefined的内容
jquery的最外面一层是这样
(function( window, undefined ) {
// jquery code
})(window);
把window传入是为了减少一层向外的搜索,传入undefined是因为个别浏览器,如ie8。允许我们手动改变undefined的值,这样,如果有人改变了它,当我们需要用这样的判断时:xxx==undefined,就会出现问题。之前没考虑过,直到昨天面试的时候,面试官问我,为什么不把undefined一起和window传入,当时我就懵逼了。
回来后想了想,做了个小测试,验证了一下自己的想法。函数的参数列表中的参数会自动在函数开头完成声明,比如这里,我们的参数列表中有undefined,那么如果我们不给这个位置传值,那么对于可以给undefined赋值的浏览器,他就相当于一个声明之后未赋值的变量,那么他的值就是undefined。
若果我们把它和window一起传进去,反倒可能把外部的undefined的值传进去。
还有一点,即使我们更改了undefined的值,当我们测试一个没赋值的变量时,仍会得到undefined。例:
//对于支持更改undefined值的浏览器
undefiend = 8;
console.log(undefined);//8
var a;
console.log(a);//undefined
var getName = function(){return 2};//函数表达式
function getName(){return 4};//函数声明
console.log(getName());//2
再看另一个例子
console.log(getName());//4
var getName = function(){return 2};//函数表达式
function getName(){return 4};//函数声明
原因:我们知道变量的声明会得到提升,就是说即使我们在代码的最后一行定义了一个变量,也像在代码顶部声明过一样,即使在我们定义前访问它,也不会报错。例:
console.log(a);//undefined
var a = 1;
这里没有报错,而是显示undefined。我们要弄清楚,只是声明得到了提升。声明和定义的差别,声明是这样:var a,即我们声明了a,但没有给他赋值。定义是这样:var a = 1,我们给他具体的值。
再回头看前两个例子,用函数声明的方式定义的函数,声明(命名)和定义都会得到提升。而用函数表达式的方法定义的函数,只有声明会得到提升。所以第一个就例子相当于:
var getName;//函数表达式的提升
function getName(){return 4}; //以函数声明方式命名的函数获得的提升
var getName = function(){return 2};
console.log(getName());//2
而第二个例子就相当于:
var getName;
function getName(){return 4};
console.log(getName());//4
var getName = function(){return 2};
还有一点关于undefined的内容
jquery的最外面一层是这样
(function( window, undefined ) {
// jquery code
})(window);
把window传入是为了减少一层向外的搜索,传入undefined是因为个别浏览器,如ie8。允许我们手动改变undefined的值,这样,如果有人改变了它,当我们需要用这样的判断时:xxx==undefined,就会出现问题。之前没考虑过,直到昨天面试的时候,面试官问我,为什么不把undefined一起和window传入,当时我就懵逼了。
回来后想了想,做了个小测试,验证了一下自己的想法。函数的参数列表中的参数会自动在函数开头完成声明,比如这里,我们的参数列表中有undefined,那么如果我们不给这个位置传值,那么对于可以给undefined赋值的浏览器,他就相当于一个声明之后未赋值的变量,那么他的值就是undefined。
若果我们把它和window一起传进去,反倒可能把外部的undefined的值传进去。
还有一点,即使我们更改了undefined的值,当我们测试一个没赋值的变量时,仍会得到undefined。例:
//对于支持更改undefined值的浏览器
undefiend = 8;
console.log(undefined);//8
var a;
console.log(a);//undefined
相关文章推荐
- js 函数定义,使用,作用域,变量声明提升,遇解析.....
- 详解js变量声明提升
- JS 变量和函数的声明提升
- 详解js变量声明提升
- JS面试中的的变量提升和函数声明
- js代码执行过程,js预编译,变量声明提升,函数体整体提升
- 第24天:js-函数变量声明提升
- Js 变量声明提升和函数声明提升
- JS中的函数声明提升和变量声明提升
- js变量声明提升
- JavaScript机制:变量&函数声明提升的那些事
- js变量声明提升,变量作用域与函数作用域,作用域链
- Js 变量声明提升和函数声明提升
- js变量,声明提升的坑
- js 的变量声明提升,以及赋值不提升
- JS变量声明提升、函数声明提升
- Js中有关变量声明和函数声明提升的问题
- js函数声明提升与变量提升
- JS变量声明提升
- JS-作用域与变量声明提升