Open mamba-1024 opened 6 years ago
this
时,它将会指向全局对象,即 window
对象this
也会指向全局对象。this
指向调用该方法的对象。this
指向新创建的对象。call
或者 apply
方法时,函数内的 this
将会被显式设置为函数调用的第一个参数。
下面是我自己借鉴网上的一些总结,感觉写的不错
在JavaScript里任何匿名函数都是属于window对象。在定义匿名函数时候它会返回自己的内存地址,如果此时有个变量接收了这个内存地址,那么匿名函数就能在程序里被使用了(可以通过在这个变量后面加一对圆括号来调用这个匿名函数),因为匿名函数也是在全局执行环境构造时候定义和赋值,所以匿名函数的this指向也是window对象。
(function(){
console.log(this == window); // true
})();
function test(num){ // 按值传递
num+=5;
console.log(num);
return num;
}
var num = 5;
var result = test(num);
console.log(result); // 10 如果是按引用传递,那么函数里的num会成为类似全局变量,把外面的num覆盖掉
console.log(num); // 5 也就是说,最后应该输出20(这里输出10)
注:js中不存在引用传递,如果存在引用传递的话,那么函数内的变量将是全局变量,在外部也可以访问,但这明显是不可能的
function setName(obj){ // obj = person
obj.name = "lisi";
obj = new Object();
obj.name = "wangwu";
}
var person = new Object();
setName(person);
console.log(person.name); // => lisi
console.log(obj.name); // Uncaught ReferenceError: obj is not defined
在将person传递给obj后,其name属性就被设置成了”lisi”。又将obj重新定义了一个对象,另一行代码为该对象定义了一个带有不同值的name属性。 如果person是按引用传递的,那么person就会自动被修改为指向其name属性值为”wangwu”的新对象,但事实上并没有,其name属性依然是”lisi”。 这就说明:即使在函数内部修改了参数的值,但原始的引用仍然保持不变。实际上,当在函数内重写obj时,这个变量引用的就是一个局部对象 了。而这个局部对象会在函数执行完毕后立即被销毁。
因此:访问变量有 按值 和 按引用 两种方式,而参数只能 按值传递。
数据类型
undefined,null,Boolean,Number、String
, 它们的值保存在栈空间,我们通过按值来访问的.对象Object、数组Array、函数function 等
, 对应的值,则必须在堆内存中为这个值分配空间。由于引用类型值得大小不固定(对象有很多属性和方法),因此不能把它们保存在栈内存中。但是内存地址大小是固定的,因此可以将内存地址保存在栈内存中。简而言之:栈内存中存放的是基本数据类型值,堆内存中存放引用类型值,引用类型值在内存中的地址存放在栈中,也就是我们常说的对象引用(指针)。
从上面例子可以看出:在变量复制方面,基本类型和引用类型也有所不同,基本类型复制的是值本身,而引用类型复制的是内存地址。