通过检查jQuery元素更好地理解Javascript

65F*_*f05 8 javascript jquery javascript-objects

因为jQuery是一个广泛使用和成熟的协作工作,我不禁要在编写更好的Javascript时查看其源代码以获得指导.我一直使用jQuery库和我的PHP应用程序,但是当我看到这个相当复杂的库的内幕时,我意识到我仍然不了解Javascript.罗,我对SO社区有几个问题.首先,请考虑以下代码......

$('#element').attr('alt', 'Ivan is SUPER hungry! lolz');
Run Code Online (Sandbox Code Playgroud)

VS

$('#element').attr({'alt': 'Ivan is an ugly monster! omfgz'});
Run Code Online (Sandbox Code Playgroud)

现在,这是说该attr()方法被设计为接受EITHER属性名称,属性名称和值,还是配对值映射?有人可以给我一个关于地图实际是什么的简短解释以及它与Javascript中的数组的重要方式吗?

继续前进,整个图书馆都包含在这个业务中......

(function(window, undefined) { /* jQuery */ })(window);
Run Code Online (Sandbox Code Playgroud)

我知道包装的括号会导致类似的行为body onLoad="function();",但这种做法被称为什么,它与使用onLoad事件处理程序有什么不同?此外,我最后无法在(window)那里做出头或尾.这个window对象究竟发生了什么?

在评估中我是错误的,对象与Javascript中的函数没有什么不同吗?如果我错了,请纠正我$(),但它是包含所有jQuery对象,但它看起来就像一个方法.这是代码示例的另一个快速问题...

$('#element').attr('alt', 'Adopt a Phantom Cougar from Your Local ASPCA');
Run Code Online (Sandbox Code Playgroud)

......内部应该看起来像这样(也许我错了)......

function $(var element = null) {
    if (element != null) {
        function attr(var attribute = null, var value = null) {
            /* stuff that does things */
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是在Javascript中定义对象及其子方法和属性的常规过程吗?将Javascript与PHP进行比较,.您是否使用->与从对象检索方法相同的方式使用句点?

我为这有点冗长而道歉,但对这些问题的回答将对我揭示jQuery和Javascript的一般情况.谢谢!

Ray*_*nos 2

1.方法重载

$('#element').attr('alt', 'Ivan is SUPER hungry! lolz');

$('#element').attr({'alt': 'Ivan is an ugly monster! omfgz'});

var attr = function (key, value) {
  // is first argument an object / map ?
  if (typeof key === "object") {
    // for each key value pair
    for (var k in key) {
      // recursively call it.
      attr(k, key[k]);
    }
  } else {
    // do magic with key and value
  }
}
Run Code Online (Sandbox Code Playgroud)

2. 关闭

(function(window, undefined) { /* jQuery */ })(window);

不用作onload处理程序。它只是在函数内创建新的作用域。

这意味着这var foo是一个局部变量而不是全局变量。它还创建了一个实际undefined变量来使用,因为未指定的参数传入undefined

这可以防止window.undefined = true哪些是有效/允许的。

最后的(窗口)位。这里的窗口对象究竟发生了什么?

它通过使其本地化来微观优化窗口访问。局部变量访问比全局变量访问快约 0.01%

我认为对象与 Javascript 中的函数没有什么不同的评估是错误的吗?

是和不是。所有函数都是对象。$()只是返回一个新的 jQuery 对象,因为它在内部调用return new jQuery.fn.init();

3.你的片段

function $(var element = null) {

Javascript 不支持默认参数值或可选参数。模拟这一点的标准做法如下

function f(o) {
  o != null || (o = "default");
}
Run Code Online (Sandbox Code Playgroud)

比较 Javascript 和 PHP,你是否使用句点 . 与使用 -> 从对象中检索方法的方式相同吗?

您可以使用访问对象的属性foo.property,或者foo["property"]属性可以是任何类型,包括函数/方法。

4.您的问题中隐藏的杂项问题

有人可以给我一个简短的解释,说明地图实际上是什么以及它与 Javascript 中的数组的重要区别吗?

使用它创建的数组var a = []仅包含一个键值对列表,其中所有键都是正数。它还拥有所有的Array methods. 数组也是对象。

地图只是一个对象。对象只是一袋键值对。您可以在对象的某个键下分配一些数据。该数据可以是任何类型。