这两个关于JavaScript作用域链的示例有什么不同?
以及:这两个关于JavaScript作用域链的示例有什么不同?,javascript,Javascript,以及: 为什么第二个示例的输出是1而不是2?这是因为p变量只存在于函数x(p)中。因此,内存中有一个新空间,一个拷贝变量a。在第一个示例中,它是指向变量a的内存地址的指针 另一方面,对象有一个“按引用传递”,所以如果您这样做: var a = 1; function x(p) { p = 2 console.log(p) // 2 } x(a); console.log(a); // 1 您将看到“2”而不是“1”。这是因为您的p变量仅存在于函数x(p)中。因此,内存中有
为什么第二个示例的输出是1而不是2?这是因为
p
变量只存在于函数x(p)
中。因此,内存中有一个新空间,一个拷贝变量a
。在第一个示例中,它是指向变量a
的内存地址的指针
另一方面,对象有一个“按引用传递”,所以如果您这样做:
var a = 1;
function x(p) {
p = 2
console.log(p) // 2
}
x(a);
console.log(a); // 1
您将看到“2”而不是“1”。这是因为您的
p
变量仅存在于函数x(p)
中。因此,内存中有一个新空间,一个拷贝变量a
。在第一个示例中,它是指向变量a
的内存地址的指针
另一方面,对象有一个“按引用传递”,所以如果您这样做:
var a = 1;
function x(p) {
p = 2
console.log(p) // 2
}
x(a);
console.log(a); // 1
您将看到“2”而不是“1”。因为函数参数是在函数执行时“创建”的
var obj = { foo: 1 };
function x(paramObj) {
paramObj.foo = "2";
}
x(obj);
alert(obj.foo);
在这段代码中,您创建了全局变量a=1;然后将其传递给x函数。在函数内部,将给定参数设置为2,并将其记录为console.log;但真正发生的是:
var a = 1;
function x(p) {
p = 2
console.log(p) // 2
};
这是因为Javascript中有两种类型的变量。数字、字符串、布尔值等只是值和引用类型(如数组、对象)的值
如果你知道C++,那么这应该会使事情有所好转。这与用C++编写的Javascript中发生的情况相当:
var a = 1;
function x(given_argument) {
var p = given_argument;
p = 2; // global a variable still equals 1;
console.log(p) // 2
};
Javascript中的引用类型是指针,这意味着如果作为参数传递,可以从函数内部更改它们。但是,如果您传递正常值,如number或boolean,它将在函数中声明,并隐式发生
我希望它澄清了这个问题。因为函数参数是在函数执行时“创建”的
var obj = { foo: 1 };
function x(paramObj) {
paramObj.foo = "2";
}
x(obj);
alert(obj.foo);
在这段代码中,您创建了全局变量a=1;然后将其传递给x函数。在函数内部,将给定参数设置为2,并将其记录为console.log;但真正发生的是:
var a = 1;
function x(p) {
p = 2
console.log(p) // 2
};
这是因为Javascript中有两种类型的变量。数字、字符串、布尔值等只是值和引用类型(如数组、对象)的值
如果你知道C++,那么这应该会使事情有所好转。这与用C++编写的Javascript中发生的情况相当:
var a = 1;
function x(given_argument) {
var p = given_argument;
p = 2; // global a variable still equals 1;
console.log(p) // 2
};
Javascript中的引用类型是指针,这意味着如果作为参数传递,可以从函数内部更改它们。但是,如果您传递正常值,如number或boolean,它将在函数中声明,并隐式发生
我希望它澄清了问题。因此,
p
与a
没有关系,只与值1
,然后是2
。因此,p
与a
没有关系,只与值1
,然后是2
。您的示例很有效,但无需将obj
作为参数传递给x()
,您是对的,因此我进行了编辑以使其更有意义。代码使用了相同的参数名,现在它显示了我的观点。您的示例可以运行,但无需将obj
作为参数传递给x()
,您是对的,因此我进行了编辑以使其更有意义。代码使用了相同的参数名,现在它显示了我的观点。