我对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