这两个javascript函数到底有什么区别
What exactly is the difference between these two javascript functions?
我在学习javascript时遇到了两种类型的函数。我试着把它们放在我理解的下面。
function example(arg1, arg2) { //code to do stuff here }
和
thing.method(function(arg) {
//code to do stuff here
});
我的想法是,第一种情况是创建一个名为example的函数,该函数包含两个参数,并且内容发生在花括号中。我相信只要函数在作用域内,就可以调用和使用它(我认为这是正确的词?(。
一秒钟我就感到困惑。我的想法是,我们有一个东西(数组、对象等(,一个方法被调用(foreach、map等(,然后我就陷入了困境。有一个函数,它没有名称?只需要一个参数,就会在花括号内发生一些事情。假设它是一个数组,我们调用foreach,那么函数括号内的东西会发生在每个元素上吗?为什么我要使用它,而不是仅仅创建一个像第一个我可以调用的函数?
为什么我不能说:
function example(arg) { //stuff }
thing.method(example(arg));
我可能误解了一些事情。有人能帮我收拾一下吗?
thing.method(function(arg) {
//code to do stuff here
});
这使用了所谓的匿名函数。就像你说的,它没有名字。它作为参数传递给thing.method()
。thing.method()
的函数体将使用此函数,例如:
thing: {
method: function(callback) {
//...
callback();
//...
}
};
你不能把它写成
function example(arg) { /* stuff */ }
thing.method(example(arg));
因为在本例中,将example(arg)
的返回值传递给thing.method()
,而不是函数本身。然而,你可以这样写:
function example(arg) { /* stuff */ }
thing.method(example);
现在,您可以想象method()
设置一些变量并将其传递给您传递的函数,例如:
thing: {
method: function(callback) {
var foo = "bar";
//...
callback(foo);
//...
}
};
您的第一个函数example
是一个命名函数,可在整个JS程序中重复使用。它具有全球性。要使用它,你需要这样称呼它:
example(value1, value2);
这将把value1
和value2
发送到函数中,并且通常将使用这些值执行一些操作。函数通常返回一个值。
第二个函数是匿名函数和回调函数。它是匿名的,因为它没有名称,而回调是因为它只有在事件发生时才会被调用。您几乎总是将这些函数与事件(如click
、hover
等(结合使用。
一个很好的例子可能是,在您的例子中,您的方法是thing
上的一个点击事件。当您的用户单击thing
时,将启动匿名函数。作用域不是全局的,只有在单击事件内部才能访问它。
// jQuery callback on a click event
$("#button-in-your-program").click(function() {
console.log("Your callback function worked");
});
与这一切相关的另一个主题叫做闭包。闭包是每当调用函数时创建的词法作用域。大多数时候,你并没有真正考虑它。但当你把一个函数嵌套在另一个函数中时,它就成为了一个重要的概念。例如,当子函数引用其父函数中的变量时,闭包用于将变量的值提供给子函数。
- 全局变量和全局对象的属性之间有什么区别吗
- 在ember/handlers中使用value和valueBinding有什么区别
- 这两个关于 JavaScript 作用域链的例子有什么区别?
- Math.min()和Math.max()之间有什么区别?在Javascript中
- angularjs中的ng网格和ui网格有什么区别
- webpack开发模式和生产构建模式之间有什么区别
- 缓存!saveLocations()和addLocation()函数有什么区别
- 关于承诺/A+规范,术语“当时可”和“承诺”之间有什么区别
- 以下两者在javascript中有什么区别
- jquery.js和jquery.lite.js有什么区别
- 通过Nuget安装Angular JS和Angular JS核心有什么区别
- XMLHttpRequest对象的open()和send()方法之间有什么区别
- 这两种不同的创建对象文字的方法有什么区别
- jQuery中这两个词有什么区别
- 在Javascript语法中:和::和:::有什么区别
- getElementById 和 getElementsByClassName 有什么区别?
- (typeof variable === “function”) 和 jQuery.isFunction() 有什么区别
- 在使用JS的Ajax调用中,ajaxComplete和beforesend之间有什么区别
- $(e.target).find和template.find('input').value之间有什么区别
- 在javascript中,在变量名之前使用var有什么区别/优势吗