为什么我不需要调用操作符来调用JavaScript中的函数?

时间:2013-12-10 15:58:41

标签: javascript

很简单,我现在想为什么有时你不需要调用运算符()来进行函数调用?

这就是我通常做的事情:

function startUp() {
  alert("started");
}

// and later...
startUp(); //to call it, this will actually trigger the alert

//If I do this
startUp; //It prints the function in the a Browser's console, but won't call the function

现在,如果我将该功能附加到浏览器事件:

 <script>

    function startUp() {
      alert("started");
    }

    window.onload = startUp; //I don't need the () to call the Function! WHY is that??

  </script>

正如我在评论中提到的,为什么我有时不需要()来调用函数? (就像在这种情况下)

提前感谢您的解释。

6 个答案:

答案 0 :(得分:3)

window.onload = startUp;

这不是你调用的功能。相反,您将对函数的引用作为窗口的onload事件的处理程序传递。触发事件时,将调用与其关联的所有处理程序(即执行该函数时)。

考虑以下代码:

function foo() {
  console.log('I am fired');
}

function run(func){
  func();
}

var bar = foo; // nothing is called on this line
run(bar); // bar is not called on this line. It is called in run().
run(foo); // same thing.

对于您的示例window.onload = startUp,浏览器是触发回调的浏览器(与所有浏览器事件,超时回调等一样)。加载页面内容时,浏览器将调用startUp函数(HTML,引用的CSS,引用的图像等)。

另外值得注意的是,可以使用参数调用该函数。浏览器事件通常调用它,this是触发事件的元素(在这种情况下应该是窗口),第一个参数是触发的事件。如果你想复制它,它看起来像这样:

function fireCallbacks(element,callbacks){
  var event = new Event();
  for (var i=0; i<callbacks.length; i++) {
    callbacks[i].call(element, event);
  }
}

fireCallbacks(window, [startUp]);

Function.prototype.call用于执行具有特定this值和参数的函数。

答案 1 :(得分:1)

您没有在window.onload = startUp;示例中调用函数,而是按名称将函数指定为onload事件的事件处理程序。

答案 2 :(得分:1)

您根本不会在第二种情况下调用该函数。相反,您的浏览器将处理window.onload,类似于以下代码:

// call after document has been loaded
if(typeof(window.onload) === "function"){
    window.onload();
}

正如您所看到的,window.onload实际上已被调用,而自window.onload === startUp以来,当文档完全加载时,您与startUp()具有相同的效果。

答案 3 :(得分:1)

你没有打电话。加载页面时调用window.onLoad。你只是在改变启动时调用哪个函数(而不是自己调用它或者它会运行两次)。

答案 4 :(得分:1)

window.onload = startUp; //I don't need the () to call the Function! WHY is that??

因为你没有打电话。您只是设置对该功能的引用。

您的浏览器稍后会拨打window.onload()

答案 5 :(得分:0)

我花了一些时间来理解以下事实: javascript中的函数是对象

作为这个概念的一个例子,我给你留下一些代码来玩

function fn1(obj) {
  alert(obj&&obj.callerName?obj.callerName:'no caller');
}
h1 = fn1;// make a token out of a defined function
h1();    // and call the token

// make a token that holds an object that happens to be a function
fn2 = function () {
  alert('I am a function that is saved into a token\nI am an object that can be called and passed around');
  fn1(this);
}
// call it and pass it around
fn2();

// make an object that has a key that points to an object that happens to be a function
object1 = {
  callerName : 'object',
  fn3 : function IwillBeAttachedToAnObject() {
    alert('what is the value of `this`?');
    fn1(this);
  }
}
h2 = object1.fn3;
h2(); // what should this give us
object.fn3 // compare to last call

// let's change the value of `this` inside this function...err, object
fn2.call(object1)

// let's add a new function to our object
object1.newFunction = fn1;

对于提交迟到感到抱歉,我的互联网刚刚上线而死了