这两个关于JavaScript范围链的例子有什么不同?

时间:2016-05-16 20:23:28

标签: javascript

<ListView Margin="0,30,0,0" Name="listViewTasks">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="1*"/>
                </Grid.ColumnDefinitions>
                <StackPanel HorizontalAlignment="Left" Margin="0,0,50,0">
                    <TextBlock Text="{Binding title}" Cursor="Hand"/>
                    <TextBlock Text="{Binding date}" />
                </StackPanel>
                <StackPanel HorizontalAlignment="Right" Grid.Column="1">
                    <TextBlock  Text="{Binding countdown}" />
                </StackPanel> 
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

和:

var a = 1;

function x() {
    a = 2
    console.log(a) // 2
}
x();

console.log(a); // 2 

为什么第二个例子1的输出而不是2?

2 个答案:

答案 0 :(得分:2)

这是因为您的p变量仅存在于function x(p)内。所以,你在内存中有一个新的空间,一个复制变量a。在第一个示例中,它是指向变量a的内存地址的指针。

另一方面,对象有一个“按引用传递”,所以如果你这样做:

var obj = { foo: 1 };

function x(paramObj) {
    paramObj.foo = "2";
}

x(obj);
alert(obj.foo);

您将看到“2”而不是“1”。

答案 1 :(得分:0)

因为函数参数已被创建&#39;当函数执行时。

var a = 1;

function x(p) {
    p = 2
    console.log(p) // 2
};

在这段代码中,您创建了全局变量a = 1;然后将它传递给x函数。在函数内部,您将给定参数设置为2,并将console.log设置为它;但真正发生的是:

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,string,boolean等值,它们只是值和引用类型,如数组,对象。

如果您了解C ++,那么这应该会使事情变得轻松一些。这相当于Javascript中用C ++编写的内容:

// javascript
var a = 1; // plain value

// c++
int a = 1; // plain value

// javascript
var a = {}; // referential type, this is a pointer behind the scenes
// or
var a = new Object(); // if you prefer it this way

// c++
Object* a = new Object(); // this is a pointer to the object, but in C++ you make it a pointer explicitly, in Javascript this happens 'automagically'.

Javascript中的引用类型是指针,这意味着如果作为参数传递,它们可以从内部函数更改。但是如果你传递像number或boolean这样的正常值,它会在函数内部声明,并且它会隐式发生。

我希望它澄清了这个问题。