3

我通过stackoverflow对此感到震惊,这是一个很好的资源,对此有很多讨论,但我仍然感到困惑,为什么某些事情不起作用?

我在大学里学过 c++ 并且有点记住指针

http://www.permadi.com/tutorial/jsFunc/index2.html

我的问题是从代码中开始的,某些事情不起作用

function theAdd(a, b){    
  return a*b;
} 

//creating a copy of the function
var add3 = new theAdd(); 

add3.name = 'nameProperty';
//alert( add3(1,2))   //why doesn't this work?  
alert(theAdd(5,5)  + " " +  theAdd.name);        


function Ball()    {
    return 'balltext';
}
var ball0=new Ball(); // ball0 now points to a new object

alert(  Ball()  );         // this works
alert(  ball0() );         // why doesn't this work? shouldn't it return balltext?
4

4 回答 4

3

因为ball0是一个对象,你不能像函数一样使用它

请查看此内容以了解新的工作原理

于 2013-09-09T19:51:41.280 回答
3
//creating a copy of the function
var add3 = new theAdd(); 

这不会创建函数的副本。它将函数调用为构造函数add3将是该函数创建的对象。

alert( add3(1,2)) 为什么这不起作用?

因为add3不是一个函数(它是一个普通的对象)。

alert( Ball() );这行得通

您正在以“正常”方式调用该函数。调用的结果将是函数返回的值。

alert( ball0() );为什么这不起作用?

ball0不是函数。

它不应该返回balltext吗?

不,new关键字以特殊方式调用函数。从MDN 文档

当执行代码 new foo(...) 时,会发生以下情况:

  1. 创建了一个新对象,继承自foo.prototype.
  2. foo使用指定的参数调用构造函数,并将 this 绑定到新创建的对象。new foo等价于new foo(),即如果没有指定参数列表,则调用 foo 时不带参数。
  3. 构造函数返回的对象成为整个 new 表达式的结果。如果构造函数没有显式返回对象,则使用在步骤 1 中创建的对象。(通常构造函数不返回值,但如果他们想覆盖正常的对象创建过程,他们可以选择这样做。)

由于您返回的不是对象而是原始值(在本例中为字符串),因此在第一步中创建的对象将返回并分配给ball0.

当您调用一个函数时,new您正在使用该函数作为构造函数,即它应该创建一个新对象。运算符确保始终返回对象,new无论函数本身返回什么。

也看看:

于 2013-09-09T19:53:38.497 回答
1

该行var ball0 = new Ball();正在调用 Ball 方法,该方法返回值“balltext”,因此变量 ball0 现在具有值“balltext”,它是一个字符串,而不是函数。

您的最后一行代码alert(ball0());正在尝试调用一个函数,如果 ball0 是对函数的引用,它将起作用。由于 ball0 的值是一个字符串,这将不起作用。要弹出一个打印变量 ball0 值的警报,您的代码应该读取alert(ball0);

希望这可以帮助。

于 2013-09-09T20:05:03.550 回答
1

那里有很多问题,但很多都与 JavaScript 中的对象概念和构造函数有关。当您使用new运算符时,它会创建一个“空”对象,然后使用作为this参数传递的对象调用函数。任何函数都可以用作构造函数,我认为这会引起一些混乱。

通过一些问题:

为什么不add3(1,2)加数字?

这是因为add3是一个对象,而不是一个函数,你使用了 new 操作符(在这种情况下,构造函数没有对 做任何事情this,它的返回值在构造时被忽略了)

警报(球());

这只是一个函数调用,正如您所期望的那样,它返回一个字符串,该字符串传递给alert()

警报(球0());

这并不符合您的预期,因为 ball0 是一个对象,使用 Ball 作为其构造函数

这是W3Schools上 JavaScript 对象的一个​​很好的入门

于 2013-09-09T19:58:18.633 回答