这两个关于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()
,您是对的,因此我进行了编辑以使其更有意义。代码使用了相同的参数名,现在它显示了我的观点。