- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我 self 指导的 javascript 研究最终让我阅读了一些库,在其中我发现了以下代码片段(为简洁起见,已被 chop )。我在 Windows apache 服务器 (xampp) 上使用带有 firebug 的 Firefox。
我认为下面的代码片段就足够了,但如果有人需要它,可以在这里找到整个库:snap.svg.js on github
var Snap = (function(root) {
Snap.version = "0.4.0";
function Snap(w, h) { // can be either width, height OR
if (w) {
if (w.nodeType) { // deterimines if parameter is a dom element
return wrap(w);
}
if (is(w, "array") && Snap.set) { // deterimines if parameter is an array
return Snap.set.apply(Snap, w);
}
if (w instanceof Element) { // deterimines if parameter is a Snap.Element
return w;
}
if (h == null) { // by elimination determines if parameter is a dom element id.
w = glob.doc.querySelector(String(w));
return wrap(w);
}
}
<numerous public and private properties and methods>
.
.
.
glob.win.Snap = Snap;
return Snap;
}(window || this));
Firebug 在实例化任何用户对象之前在窗口上下文中显示 Snap 对象。我想知道究竟是什么机制将 Snap 对象注入(inject)到 DOM 中。就在那时我注意到了“var Snap”。最初,我以为就是这样。但是,由于当我更改变量名称甚至删除它时它并没有破坏应用程序,所以我感到困惑。
进一步的调查发现了 iife 的底部......具体来说,“glob.win.Snap = Snap”。由于“window”被传递到 iife,因此这似乎是实际在窗口中创建 Snap 对象的内容。将名称更改为 glob.win.Snappy 证实了这一点。
我还在学习中,如果我错了,请纠正我。我试图了解这个图书馆发生了什么。函数 Snap() 似乎是通过 glob.win.Snap 赋值注入(inject)到窗口上下文中的。我没有看到顶部的“var Snap”或“return Snap”在做任何事情。事实上,我可以将它们删除,一切似乎都运行良好。所以,我的第一个问题:这两行代码是否有一些我没有看到的功能?
第二个问题是:“this”后备参数指的是什么?我对 Snap 的有限理解是它总是在窗口命名空间内使用,所以“this”不总是窗口吗?
正当我认为我开始将范式从经典语言转变为原型(prototype)语言时,我遇到了这样的代码,这让我感到沮丧。我真的很感激一些见解。
最佳答案
我查看了引用的源代码,这里是一个更精简的版本:
var Snap = (function(root) {
Snap.version = "0.4.0";
function Snap(w, h) {}
var glob = {
win: root.window,
doc: root.window.document
};
...
glob.win.Snap = Snap;
return Snap;
}(window || this));
Snap.plugin(...);
It seems that the function Snap() is being injected to the window context via the glob.win.Snap assignment. I don't see that the "var Snap" at the top or the "return Snap" are doing anything.
你是对的, var Snap = ...;
的声明和通过 return Snap;
的赋值是多余的,因为该变量存在于全局范围内(即Window 对象)并且已由 glob.win.Snap = Snap;
我认为他们只是保留了 var 声明,因为使用类模式时它几乎是标准的:
var MyClass = (function() {
function MyClass(n) {}
return MyClass;
})();
A secondary question is: What does the "this" fallback parameter refer to? My limited understanding of Snap is that it is always used within the window namespace so wouldn't "this" always be the window?
在某些 JavaScript 环境中,根对象不称为 window
(例如,node.js 中的 global
)。 窗口 || this
将计算为根对象,无论它被称为什么。
您会经常在 JavaScript 模块中看到此类依赖注入(inject)。请参阅https://carldanley.com/js-module-pattern/了解更多。
但是,如果由于 var glob = { win: root.window, ... }
没有可用的 window
对象,该库似乎将无法运行> 作业。他们可能只是将 this
保留在那里,因为它是标准模块模式的一部分。
关于javascript - 这样做的目的是什么? IIFE 分配给 Snap.svg.js 中的 var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37753267/
我正在处理一个庞大的 javascript 代码库,我正试图对其进行重组。我不是真正的专家,我只是开始研究良好的 JavaScript 编码实践。所以,我想做的一件事是将所有代码划分为模块。在这种特殊
这个问题在这里已经有了答案: How does an IIFE's being called immediately prevent it from polluting global scope?
我对 javascript 中的以下代码感到困惑。 var x=(function(){ var customObject = function(){}; customObject.proto
我的图书馆是一个像这样的 IIFE: (function () { win.global = global; }()); 在这个库中,我将我的代码组织成模块,这些模块看起来也像这样: var
base.html 文件中有一些逻辑。我想让它对应的 js 文件更简单,并把一些功能放在一边。 有没有办法访问 IIFE 内部的变量(main.js) 来自另一个 (additional.js)? b
为什么这个函数运行时没有用返回值初始化全局XYZ? "use strict"; XYZ = (function(){ var obj = {'a':1,'b':2,'c':3}; co
最近,当我试图了解更多有关 JavaScript 中的 IIFE 和模块的信息时我想到了一个问题,即 IIFE 如何在不立即制作模块的情况下制作模块调用该函数不会使其成为一个模块.. 任何人都可以与我
这个问题在这里已经有了答案: Are 'Arrow Functions' and 'Functions' equivalent / interchangeable? (4 个答案) 关闭 6 年前。
用法:IIF(条件表达式,为真时返回值,为假时返回值) <% Function IIf(bExp1, sVal1, 
我正在使用一些 javascript 函数来模拟 require 功能,例如: // We set up an object that will include all the public modu
我有一个工作代码循环遍历数组的行,然后将值存储到另一个数组中。实际上代码没有问题,但我正在努力提高我的技能并学习新技能 这是代码 Sub Test() Dim a, i As Long, j
我想使用来自 RxJS 的 iif 实用程序有条件地调度一些操作。问题是即使测试函数返回 false,也会调用 iif 的第二个参数。这会引发错误并且应用程序立即崩溃。我对 RxJS 的功能不熟悉,所
我想产生结果: table name: HWData policy number: number of residents: factor: 100
我是 JS 的新手。如果这个问题太天真了,请原谅我。 我正在使用这样的 IIFE: var App = (function() { var test = ''; var init =
(function (w, d, u) { /* Variable Conventions _*VAR*_ is html or class text*/ var wl = '^\\/
在我的服务器端页面上,我有一段旧脚本,我想修改它以在打开确认窗口之前测试字段是否为空。这就是我尝试的方法,添加 $(#hdfldRecId) 因为如果此字段为空,我不希望打开确认。 scrip
我正在尝试在 Microsoft SQL Server 2008 R2 中使用它: SET @SomeVar = @SomeOtherVar + IIF(@SomeBool, 'value whe
在编写 IIF 语句、表和下面给出的语句时出现错误。 陈述: SELECT IIF(EMP_ID=1,'True','False') from Employee; table : CREATE TAB
我正在阅读 article关于 IIFE,但认为它带来的主要值(value)是它为变量创建了隐私,在下面的代码中,如果将“i”放在 IIFE 中,则无法更改。但是命名空间呢?鉴于它们都在“计数器”范围
如何在 PowerShell 中创建带有内联 If 的语句(IIf,另请参阅: Immediate if 或 ternary If )? 如果您也认为这应该是 native PowerShell 函数
我是一名优秀的程序员,十分优秀!