js变量问题
this指向问题,谁调用它,它就指谁!!!
1、var foo = 1;
function bar() {
foo = 10;
return;
function foo() {}
}
bar();
alert(foo);
- A 1
- B 10
- C Function
- D undefined
- E Error
2、var x = 3;
var foo = {
x: 2,
baz: {
x: 1,
bar: function() {
return this.x;
}
}
}
var go = foo.baz.bar;
alert(go());
alert(foo.baz.bar());
- A 1,2
- B 1,3
- C 2,1
- D 2,3
- E 3,1
- F 3,2
3.
var arr = [];
arr[0] = 'a';
arr[1] = 'b';
arr.foo = 'c';
alert(arr.length);
- A 1
- B 2
- C 3
- D undefined
4、
var foo = 1;
function bar() {
foo = 10;
return;
}
bar();
alert(foo);
5、
var foo = 1;
function bar() {
//下面这段代码,可能就是声明了一个局部变量foo=10;函数先声明提前,然后赋值,
foo = 10;
alert(foo);
return;
function foo() {}
}
bar();
关于问题1:难道一执行函数,里面的申明会再次置顶。
http://www.cnblogs.com/bugda/p/6036282.html
JS中变量名和函数名重名
var a=100;
function a(){
console.log(a);
}
a();
这个串代码执行完会报错 : a is not a function
问题来了,为什么会报这个错误呢? 这里涉及到函数和变量的预解析:
1)函数声明会置顶
2)变量声明也会置顶
3)函数声明比变量声明更置顶:(函数在变量上面)
4)变量和赋值语句一起书写,在js引擎解析时,会将其拆成声明和赋值2部分,声明置顶,赋值保留在原来位置
5)声明过的变量不会重复声明
知道以上的规则,上面的代码等同于 :
var a=function (){
console.log(a);
}
var a=100;
a();
相当于给a重新赋值了,所以会报错.
链接:http://www.jb51.net/article/55200.htm
函数定义表达式 var fns = function (){ // ... }; // 函数声明语句 function fns(){ // ... } |
函数声明语句“被提前”到外部脚本或外部函数作用域的顶部,所以以这种方式声明的函数,可以被再它定义之前出现的代码所调用。而函数定义表达式中,变量的声明被提前了,但是给变量的赋值是不会提前的,所以,以表达式方式定义的函数在函数定义之前无法调用。