我对javascript的自以为是

时间:2023-03-08 17:36:58

参数的作用域

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