今晚在写connect的Response Pipelining的时候发现,若在函数内把该函数的传入参数进行重新定义的时候,该对象的指针不会起作用,即函数以外的那个传入的对象不会受影响。
var foo = "foo";
function reset (arg) {
arg = "bar";
console.log(arg);
}
reset(foo); // bar
console.log(foo); // foo
大家来讨论下。
27 回复
var array= [1,2];
function reset (arg) {
arg.push(3);
console.log(arg);
}
reset(array); // [1,2,3]
console.log(array); // [1,2,3]
@WillWen 哦去,你也是夜猫子!再看看这个,放在一块看更有意思
var foo = "foo";
function reset () {
foo= "bar";
console.log(foo);
}
reset(foo); // bar
console.log(foo); // bar
实际上可以这样理解:当我们运行某个函数并传入参数时,解析器就会新生成一个映像,这个映像拥有所以对应原传入参数各属性的getter(而没有setter),因为对象的方法处在该函数的作用域之外,所以方法中对该对象的重新赋值是有效的,而在函数作用域内的参数是没有setter的,故set动作无效。 PS:这就是为什么Backbone会选择用方法来改变值,而不是直接使用对象字面量。
js 中 数组和对象师引用的 你的例子中foo是字符串 是值传递不是引用传递
var foo = {a:2};
function reset(arg) {
arg.a = 1;
console.log(arg.a); //1
}
reset(foo);
console.log(foo.a); //1