我对javascript的自以为是

 参数的作用域

if(true){
    var tester = "Hello World";
}

console.log(tester);

按照以往的经验,觉得上面的代码会报错,而实际不会。

javascript中if, for这两个语句的{}并不会形成一个密闭的空间,以至于其中声明的变量外界访问不到。

所以这里的tester是存在的。

实际上能够形成这种密闭空间的只有function,或者称为其作用域的产生完全由函数来决定

function test() = {
    if(true){
        var tester = "Hello World";
    }
}
console.log(tester); // error

而这样的话就没有问题:

function test() = {
    if(true){
        var tester = "Hello World";
    }
}
test();
console.log(tester); // "Hello World"

 

变量初始化

javascript的函数中定义变量的位置跟java不同,如下:

var tester = "Hello world";

function test(){
    console.log(tester);
    var tester = "again";
}

test(); // undefined

出现这种状况的原因是var tester = "again";在test形成的作用域中,尽管在执行console.log的时候没有被初始化,但是这个变量是存在的。

var tester = "Hello world";

function test(){
    var tester = "again";
    console.log(tester);
}

test(); // again

 

call, apply, bind相同点和区别

相同点: 他们都是用来改变方法中this所指定的上下文的。

不同点:

假如有method方法, foo对象, arg1和arg2两个参数。

1 call vs apply, 参数的类型

method.call(foo, arg1, arg2);

method.apply(foo, [arg1, arg2]);

2 call vs bind

bind方法的返回值是函数!!!

method.call(foo, arg1, arg2);

method.bind(foo, arg1, arg2)();

method.bind(foo)(arg1, arg2);

 

javascript中的私有变量,静态变量,实例变量

不知道我可不可以这么说,javascript中的讲台变量和实例变量的苛刻程度或者说明确程度比java要高。

私有变量

function Person(){
    var name = 'voctrals';
    var display = function(){
        console.log(this.name);
    }
}

其中的name和display都是私有变量,在方法外是无法访问到的。

var person = new Person();
console.log(person.name);    // undefined
console.log(typeof person.display);    // undefined

严格到这种程度也够拼的。即使是person对象也不能够访问到。

静态变量

javascript的静态变量真的是属于类的,不属于对象,甚至对象都不能够访问到。

function Person(){
}
Person.name = 'voctrals';
Person.display = function(){
    console.log(this.name);
}

这样一来name和display就是Person这个类的静态变量了。

console.log(Person.name);    //'voctrals'
console.log(typeof Person.display);    // function

var person = new Person();
console.log(person.name);    // undefined
console.log(typeof person.display);    // undefined

实例变量

实例变量就是指方法内部的变量,但是这个变量是由this引用的,不然的话就成为全局变量了。

function Person(){
    this.name = 'voctrals';
    this.display = function(){
        console.log(this.name);
    }
}

实例变量属于实例,一个实例的改变肯定不会影响到另外一个实例的变量。

var person1 = new Person();
person1.name='voctrals again';
console.log(person1.name);    // voctrals again
console.log(typeof person1.display);    // function
var person2 = new Person();
console.log(person2.name);    // voctrals
console.log(typeof person1.display);    // function

console.log(Person.name);    // undefined
console.log(typeof Person.display);    // undefined

 

posted @ 2015-01-26 13:32  VoctrALs  阅读(118)  评论(0编辑  收藏  举报