因为 jQuery 是一种广泛使用且成熟的协作成果,所以我不得不查看它的源代码以获取编写更好的 Javascript 的指导。我一直将 jQuery 库与我的 PHP 应用程序一起使用,但是当我深入了解这个相当复杂的库时,我意识到我仍然不了解 Javascript。瞧,我有几个问题要问 SO 社区。首先,考虑以下代码...
$('#element').attr('alt', 'Ivan is SUPER hungry! lolz');
对比
$('#element').attr({'alt': 'Ivan is an ugly monster! omfgz'});
现在,这是不是说 attr() 方法被设计为接受一个属性名称、一个属性名称和一个值,或者一个值对映射?谁能给我一个简短的解释,说明映射实际上是什么,以及它与 Javascript 中数组的重要区别?
继续前进,整个图书馆都包裹在这项业务中......
(function(window, undefined) { /* jQuery */ })(window);
我知道包裹的括号会导致类似于 body onLoad="function();" 的行为,但这种做法叫什么,它与使用 onLoad<> 事件处理程序?此外,我无法在最后确定 (window) 位的正面或反面。这里的 window 对象到底发生了什么?
我认为对象与 Javascript 中的函数没有区别的判断是否错误?如果我在这方面有误,请纠正我,但是 $() 是包罗万象的 jQuery 对象,但它看起来就像一个方法。这是另一个带有代码示例的快速问题...
$('#element').attr('alt', 'Adopt a Phantom Cougar from Your Local ASPCA');
...内部应该看起来像这样(也许我对此有误)...
function $(var element = null) {
if (element != null) {
function attr(var attribute = null, var value = null) {
/* stuff that does things */
}
}
}
这是在 Javascript 中定义对象及其子方法和属性的常规程序吗?将 Javascript 与 PHP 进行比较,您使用句点 . 的方式是否与您使用 -> 从对象检索方法的方式相同?
我很抱歉这有点冗长,但对这些问题的回答将向我揭示很多关于 jQuery 和 Javascript 的一般信息。谢谢!
最佳答案
<强>1。方法重载
$('#element').attr('alt', 'Ivan super 饿!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
}
}
<强>2。关闭
(function(window, undefined) {/* jQuery */})(window);
不用作 onload 处理程序。它只是在函数内创建新范围。
这意味着 var foo 是局部变量而不是全局变量。它还创建了一个真正的 undefined 变量以供使用,因为未指定的参数在 undefined
这个 gaurds againts window.undefined = true 这是有效的/允许的。
the (window) bit there at the end. What exactly is happening with the window object here?
它通过本地化微优化窗口访问。局部变量访问比全局变量访问快 0.01%
Am I wrong in the assessment that objects are no different than functions in Javascript?
是也不是。所有函数都是对象。 $() 只返回一个新的 jQuery 对象,因为它在内部调用了 return new jQuery.fn.init();
<强>3。你的片段
函数 $(var element = null) {
Javascript 不支持默认参数值或可选参数。模拟这一点的标准做法如下
function f(o) {
o != null || (o = "default");
}
Comparing Javascript to PHP, do you use a period . the same way you would use -> to retrieve a method from an object?
您可以使用 foo.property 或 foo["property"] 访问对象的属性,属性可以是任何类型,包括函数/方法。
<强>4。问题中隐藏的杂项问题
Can someone give me a short explanation of what a map actually is and the important ways that it differs from an array in Javascript?
数组是使用 var a = [] 创建的,它只包含一个键值对列表,其中所有键都是正数。它还具有所有 Array methods .数组也是对象。
map 只是一个对象。对象只是一包键值对。您在对象的键下分配一些数据。此数据可以是任何类型。
强>强>强>强>关于javascript - 通过检查 jQuery 元素更好地理解 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6440885/
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查