1

我有以下代码:

function show(){
    var a=document.getElementById('somediv').style.display;
    a="block";
}

上面的代码不起作用,如果我们使用它就可以了

 {
     var a=document.getElementById('somediv');
     a.style.display="block";
 }

上面的代码有什么问题?

4

3 回答 3

6

要理解这一点,您需要了解一点关于 javascript 分配的知识。

当您使用 = 运算符时,javascript 中有两种类型的赋值:按值赋值和按引用赋值。虽然某些语言让您可以选择在任何给定时间使用哪种类型的作业,但 javascript 并没有给您选择。它对何时使用每个规则都有一套严格的规则。

“按值赋值”意味着将特定值(如数字3或字符串"none")分配给另一个变量。

“通过引用赋值”意味着指向另一个变量的指针被放置到您的新变量中,并且对该对象内容的任何编辑都将反映在这两个位置。

对于字符串、数字和布尔值等简单类型,javascript 总是使用按值赋值。对于像数组和对象这样的类型,javascript 总是通过引用进行赋值。这意味着当你这样做时:

var a=document.getElementById('somediv').style.display;

由于display属性中的值是一个字符串,javascript 将使用按值赋值,并将display属性中字符串的值复制到a变量中。一旦制作了这个副本,该变量就与该属性a没有任何关系。display您可以完全独立地更改display属性,a因为它们每个都有自己的字符串副本。

所以,当你这样做时:

a="block";

您只是为变量分配了一个新字符串,因为它与先前的属性a无关。display


另一方面,当你这样做时:

var a=document.getElementById('somediv');

您将一个对象分配给a. 而且,javascript 总是通过引用分配对象。这意味着它a有一个指向somediv对象的指针。没有副本,它们都指向完全相同的对象。因此,您对任一引用所做的任何更改实际上都会更改同一个对象。所以,当你这样做时:

 a.style.display="block";

您正在更改实际的 DOM 对象。


我记得的规则是数字、字符串和布尔值等简单类型在分配时会被复制(按值分配)。像数组和对象这样的复杂类型不会被复制,只有指向原始对象的指针被放入新变量(通过引用分配),因此它们都指向完全相同的对象。

按值赋值非常简单。通过引用分配可能既强大又偶尔令人困惑,从而导致软件中的错误无法预料到真正引用原始文件的后果。因此,如果您想要一个对象的实际副本,则必须显式地制作该对象的副本,因为赋值不会为您做到这一点。另一方面,只要您了解它的工作原理,拥有可以传递的复杂对象的引用会非常有用。在 javascript 中,无法获取对数字、字符串或布尔值等简单类型的引用。它可以放入一个对象(作为一个属性),然后您可以传递对该对象的引用,但不能传递对简单类型的引用。


这里有一些例子:

// define person
var person = {height: 66, hair: "blonde"};

// assign the person object to bob
// because person is an object, the assignment is by reference
var bob = person;

// change bob's hair
bob.hair = "red";

// because assignment was by reference, person and bob are the same
// object so changing one changes the one original
alert(person.hair);    // red

// define person
var person = {height: 66, hair: "blonde"};

// assign the person's height to a variable
// because height is a number, the assignment is by value (e.g. it's copied)
var myHeight = person.height;

// change both heights
myHeight = 72;
person.height = 60;

// because assignment was by value, myHeight and person.height are 
// completely separate copies so changing one does not affect the other
alert(myHeight);         // 72
alert(person.height);    // 60
于 2012-04-07T06:11:29.800 回答
1

=赋值运算符。您正在将某些内容放入变量中。在第一种情况下,您设置a为 的值display。这是一个等于blocknone等的字符串。

在第二种情况下,您设置a为 object somediv。然后在其上设置显示属性。

第一种情况不起作用,因为您的代码说:设置字符串的显示属性。字符串没有显示属性,因此失败。这就像在说:

'foobar'.style.display = 'none'
于 2012-04-07T06:02:05.937 回答
0

你写错了函数的拼写。根据您的代码document.getElementById('somediv').style.display返回 div 的当前显示状态,因此设置显示块会出错。

您将像这样直接设置 div 显示属性

function show(){
    var a=document.getElementById('somediv').style.display="block";
}
于 2012-04-07T06:16:36.710 回答