<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?
答案 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这样的正常值,它会在函数内部声明,并且它会隐式发生。
我希望它澄清了这个问题。