为什么这个简单的JavaScript代码不起作用

时间:2012-04-07 05:59:50

标签: javascript

我有以下代码:

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

上面的代码不起作用,如果我们使用

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

上述代码有什么问题?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

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

'foobar'.style.display = 'none'

答案 2 :(得分:0)

你写了错误的功能法术。 根据您的代码document.getElementById('somediv').style.display返回div的当前显示状态,因此它为设置的显示块提供错误。

您将直接设置div显示属性,如此

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