4

我不明白在 jQuery 上声明函数的方式之间的区别,有时我在尝试调用函数时浪费了一些时间,但它不能正常工作,因为它不存在于上下文中。我什至不知道这是在 jQuery 上声明函数的不同方式还是有其他方式。这里有人可以解释一下吗?我完全是菜鸟。

    $(function () {
        // Your code
    })

    jQuery(function($) {
        // Your code
    });

    function () {
        // Your code
    }
4

7 回答 7

8
$(function() { })

...完全等同于...

$(document).ready(function() {
});

这将在 DOM 准备好(DOMReady 事件)时触发该函数。

jQuery(function($) {
});

是一样的东西。在大多数设置中,$:= jQuery(唯一的例外是在 NoConflict 环境的情况下)。您传递给 jQuery 的闭包的第一个参数将返回该jQuery对象。所以,这个函数只是简单地重新映射$jQuery除了执行另一个函数之外。

第三条语句是简单的函数声明,与jQuery无关。

于 2013-05-24T20:40:51.277 回答
7

注意:这确实太长了,但我希望有人觉得它有帮助。

对于初学者:($或者jQuery,它们通常是相同的东西)是一个函数。在前两个示例中,您正在调用该函数,并将其传递给匿名函数的引用。这是一个 jQuery 快捷方式,用于将传递的函数添加为“document.ready”事件侦听器(实际事件名称DOMContentLoaded在兼容的浏览器中)。

JavaScript 有三种创建函数的方法:

1.函数声明

function foo() {
    // code
}

在声明中,函数必须始终命名。在这种情况下,函数名称是“foo”。

2.函数表达式

可以命名或不命名。通常,他们是匿名的。根据它们在代码中出现的位置,它们将被视为无效语法。例如,这是一个语法错误:

// syntax error
function() {
    // code
}

但这不是:

// passing a function expression is fine
foo(function() {
    // code
});

这也是有效的:

// parentheses make it an expression too
(function() {
    // code
});

这个也是:

// the negation operator also makes it be interpreted as an
// expression, instead of a syntax error
!function() {
    // code
}

前两个示例通常用于立即调用函数:

!function() {
    alert('invoked')
}();

(function() {
    alert('invoked')
}());

孤立的,没有调用括号,它们几乎没用,因为如果我们不将它分配给任何东西,对新创建函数的引用会立即丢失。

另一方面,这非常有用:

// function expressions are fine on the right-hand-side of an assignment
var fn = function() {
    // code
}

3.使用函数构造函数

// This is similar to 'eval'
// the string you pass will be the body of the function
var fn = new Function("return true");

您还说您对特定上下文中不存在的函数和变量感到困惑。这是因为作用域:在 JavaScript 中,每个函数都会创建一个新作用域。如果您创建一个变量(用 声明var)或另一个函数(使用上述任何有效的变体),则该变量或函数在声明它的函数之外将不可见。但是它们将在同一范围内定义的其他嵌套函数中可见(嵌套函数“关闭”它们是外部范围,因此通常称为“闭包”)。

于 2013-05-24T20:45:07.927 回答
3

请记住,javascript 中的字符可以是变量名。所以在 jQuery 的源代码中有类似于这个定义的东西:

var $ = jQuery = windw.jQuery;

所有这些都是相同的变量。我指出这一点,因为$()jQuery()都是同一件事。


这实际上是 jQuery.ready() 的快捷方式,其中传递的参数是根据 jQuery 加载文档时的回调。当您function(){}作为参数放置时,您正在创建一个匿名函数,这就是在调用回调时执行的操作。

$(function () {//passing anonymous function
    // Your code
})

这实际上不是有效的代码,因为它必须有一个名称。它将抛出异常“SyntaxError: Unexpected token (”。

function () {
    // Your code
}
于 2013-05-24T20:43:12.090 回答
2

第三个是函数声明,它作为没有名字的函数没有任何作用,不被调用,而前两个是等效的($是jQuery的别名)在DOM时要求jQuery调用函数的方式准备好了。它也相当于

$(document).ready(function(){
})

http://api.jquery.com/ready/

于 2013-05-24T20:38:15.070 回答
2

前两种调用函数的方式,是$(document).ready()函数的快捷方式。这意味着如果您在其中调用主题,$否则jQuery它们将像那样执行。参考http://api.jquery.com/ready/!第三个是正常的函数调用。$使用or的区别在于jQuery与其他库的冲突。

于 2013-05-24T20:38:57.250 回答
1

在 JavaScript 中,您可以将函数传递给其他函数。当你看到类似的东西

$('div').click(function() {
    alert("clicked");
});

您将一个匿名函数作为参数传递给该click()方法,该方法仅执行您给它的函数。

因此,您可以使用

function runOnClick() { alert("clicked"); }

$('div').click(runOnClick);
于 2013-05-24T22:43:54.797 回答
0

jQuery 不是一种编程语言。这是一个用 JavaScript 为 Javascript 编写的库。在 JavaScript 中声明函数的规则是您唯一需要遵循的规则。jQuery 没有提供任何新的方法来定义函数。

这些不是有效的函数定义:

$(function () {
    // Your code
})

jQuery(function($) {
    // Your code
});

这是一个有效的函数定义:

function myFavoriteFunction() {
    // Your code
}
于 2013-05-24T20:39:03.730 回答