几年前,我们讨论过 CSS 的“顿悟”时刻。也就是说,你学习 CSS 时,某个知识点让你豁然开朗,感觉理解了所有内容的那个瞬间。对于 CSS 来说,我的顿悟时刻是意识到页面上的每个元素都是一个矩形框,它们以特定的方式进行布局,并且我可以影响这些框的大小、位置和内容。
让我们再来一次,这次针对 JavaScript!如果您感觉自己对 JavaScript 有了相当的理解,您的“顿悟”时刻是什么?或者您还在等待它吗?
对我来说,我从未写过一行 JavaScript 代码,但我拿起了一本书 Learning jQuery,并在航班上开始阅读。我顿悟的那一刻,我意识到 jQuery 本质上是一个“查找某些内容,执行某些操作”的库。我已经了解了 CSS,而 jQuery 使用 CSS 选择器来“查找某些内容”。在 jQuery 中“执行某些操作”可以像“点击”、“隐藏”、“显示”、“滑动切换”等一样简单。即使是我也能做到,我当时这样想,然后我冲到酒店房间开始尝试。
对我来说,那个时刻是当我意识到一切都是对象的时候。
我也是!像对象一样思考改变了一切!
再加一票,一切都是对象。这与我在同一天稍后获得的 DOM “顿悟”时刻有着异曲同工之妙,原因非常相似。
我也是!我当时完全惊呆了!:D
有人可以详细解释一下吗?我以前听说过这很重要,但仍然不太明白。谢谢!
感谢 @Charlie 的回复。确实,时间就是金钱,没有意义为了学习过时的 API 而浪费时间,当全世界都在努力提高生产力时。
当我还是个孩子的时候,我会拆掉我所有的玩具来寻找它们工作原理的原因;同样地,看到很多人每天都在使用 jQuery 而没有真正理解其背后的机制,我感到难过。
正如 @ezekiel 所述,您知道 JS 本身(以其独特的方式)是 100% 面向对象的?我写了一篇论文专门研究这个课题!欢迎访问我的公司实验室网站 http://lab.pragres.com/sweb/ 查看。
再加一票,一切都是对象。学习了这一点之后,一切都变得非常简单。
理解“对象”帮助我完成了所有编程任务。例如,PHP 从中受益匪浅。
我与 javascript 的顿悟时刻尚未到来,但当我读到 Salvi 的 评论 时,我确实有了一种顿悟的感觉!:)
它是对象!然后突然间一切都清楚了
绝对是“它是对象!”的那一刻。彻底改变了我编写 Javascript 的方式。
我非常希望 Javascript 是面向对象的。Javascript 虽然是基于对象的,但它是原型导向的。这并不意味着你不能用这种语言做一些让它 *看起来* 面向对象的事情。你可以。但它不是语言语法的一部分。
再加一票
但 javascript *是* 面向对象的。它只是不是经典的。说它不是面向对象的,因为它没有类,就像说没有变量,因为没有严格的类型一样。
一切都是对象 :)
如果你喜欢这种方法,你应该尝试 Ruby。
数字、代码块、类,以及基本上所有东西都是对象。
自相矛盾的是,Class 对象的类就是它自身。
我的 javascript 顿悟时刻是当我意识到它与 PHP 有多么相似时。设置变量、设置函数、从 dom 中获取、处理、输出……就是这样。
我也是!太棒了!PHP 万岁!!!
我认为您很快就会有一个“顿悟”时刻,当您意识到 javascript 和 PHP 实际上并不相似时。客户端与服务器端……它们唯一相似之处在于它们都是编程语言。
我的顿悟时刻是 JavaScript 闭包。在一次面试中搞砸之后。我知道我必须真正弄清楚闭包。所以,如果我可以在这里传达给所有人,这是我对闭包的理解,我希望它能有所帮助
据我了解,在基本层面上,闭包是一个返回的函数,它封装(而不是引用)返回它的父函数中的变量/值。我希望我的解释是正确的,如果是这样,我希望它能帮助这里的某个人。
闭包是在函数调用*完成后仍然保持活跃状态的一组局部变量,因为这些变量可能仍然被局部函数需要,并且对局部函数的引用以某种方式在函数调用期间被导出。
局部函数可以由封闭函数返回,这是导出其引用的方法之一,但还有其他常见的方法,局部函数可以附加到事件、推送到数组,任何防止它在封闭函数完成后被取消引用的方法。
* 不一定是函数,它可以是任何执行上下文,但让我们现在先将其保留在函数调用上,好吗?
闭包实际上是属于已过期执行上下文的所有内容,由于仍然存在对其的引用,因此尚不能将其丢弃。
我不能说我能够将理解闭包描述为 JavaScript 的顿悟时刻,它是一个完全独立的顿悟时刻,超越了 JavaScript。我的意思是,你可以在很久之前就“理解” JavaScript,然后再理解闭包,它们非常高级。
大多数人完全偶然地发现了闭包,阅读了一些资料,然后开始有目的地使用它们,但仍然没有完全理解它们。这使得它成为一个棘手的面试问题,因为它是人们可以在不真正能够解释的情况下使用的那种东西。(而且关于这个主题有很多难以阅读的教程,这并没有帮助。)
现在你让我想知道,仅仅因为不理解闭包,你能在什么样的面试中失败。它们听起来对于高级 JavaScript 理解非常重要,但我很惊讶你可能因为不理解它们而在一场面试中失败。
是闭包以及其他一些东西。我申请的是一个非常高级的 JS 职位。
@Lee Kowalkowski:啊哈!!(好吧,就在这里:D)
闭包,我知道它们是什么,但阅读书面解释仍然让我感到困惑。Stoyan Stefanov 为你画了一个图表。我看了那个图表,我头脑中的灯亮了。这是一本很棒的书。
Stoyan Stefanov 编著的《面向对象的 Javascript》。
嗯,最近,我有一个小小的顿悟时刻,我意识到我所使用的 javascript 中很少一部分应该在 DomReady 之前运行。而且,实现一个优秀的跨浏览器的 domready 的唯一方法是使用经过测试的内容,例如 jQuery 的 domready 函数,或者从 jQuery 中提取的 DomReady 库。
本质上是意识到在 jQuery 之前,我可能一直都在做错。
呃,我的意思是,即使是 .hide() 或 .show() 也需要包装在 domready 中。所以……除了函数声明之外,几乎所有东西都需要。
jQuery 万岁。
1. 一切都是对象。
2. 闭包。
3. 函数可以被存储和传递。
赞同。一旦你能理解这三件事,你就可以从“用 JavaScript 做事情”转变为“用 JavaScript 创建东西”。
对我来说也是以上三点。还有“匿名”函数。可以将整个函数体传递给另一个函数。
与 Hector 差不多。我的顿悟时刻是在我开始学习用原生 JavaScript 创建对象的时候。当你理解方法只是函数内部的函数时,事情就会变得清晰起来。我的第二个顿悟时刻是,我开始理解一切都是对象。
你发布这个很有趣,因为昨晚我在重新设计我的网站时,我谷歌搜索了 jQuery 以了解更多信息。我现在(6 小时后)理解了很多。所以我想我的顿悟时刻是当我意识到 jQuery 和 JavaScript 拥有如此巨大的潜力,并且像上面提到的那样,它只是一种面向对象的语言。我总是害怕看到它在你网站上使用,现在我准备好了!
实际上,jquery 关注的是“当某些事情发生时,找到某些东西,做某些事情”,因为 javascript 是基于事件的。
我的顿悟时刻还没有到来,我想 xD
好吧,我不同意你的“JavaScript 是基于事件的”说法……
JavaScript 是面向对象的(原型风格),其中包含了一些函数式编程。
您可以定义文档元素(对象)在某些事件触发时将如何表现,但事件处理程序是对象属性……DOM 和浏览器窗口可以触发事件,而不是 JS。
我不记得自己有过 JavaScript 的顿悟时刻,我已经用它编程好几年了。我认为这是因为 JavaScript 非常宽松和实用,它允许程序员以他们已经熟悉的方式表达自己。
我的顿悟时刻是当我发现每个操作都会返回一个值的时候。
我试图创建一些连续的动画,但所有动画都同时运行。我在浩瀚的互联网上找到一个示例,它将一个函数嵌套在另一个函数中。我的元素开始按照我想要的方式移动,我开始运行了。从那以后,一切变得有趣起来。
我在 Netscape 的早期就开始使用 JS,当时一切都比较模糊,但我的顿悟时刻是我发现了 DOM 和 JS 对象之间的关系,并且可以通过方法访问父级和兄弟级。基本上,对我来说这是一个双重顿悟,因为 DOM 的概念也让我豁然开朗。
伙计们,那是在 1998 年左右 :-)
几年前,当我第一次开始手动执行 Ajax 请求时(当时没有使用 jQuery)。在此之前,我编写的代码都是简单的过程式/函数式代码,并且我不担心基于事件或面向对象的模式。这也是我开始学习如何避免旧的内联
onClick='doEvent()'
并开始使用非侵入式 JavaScript 的时候。我正在 http://javascript.crockford.com/ 上学习 JavaScript,然后了解了 lambda 函数和闭包的概念。这真是令人震惊。
非常感谢 Crockford 先生
像许多其他人一样,理解闭包时,一切都突然变得清晰起来。即使在我认为自己了解 JavaScript 之后,阅读 Stoyan Stefanov 的“JavaScript Patterns”也充满了小小的顿悟时刻。
我赞同 Stoyan 的书“Javascript Patterns”!!
那本书中有很多顿悟时刻,对于高级 JavaScript 来说至关重要!
非常值得购买,并且作用很大!
我刚刚开始接触 JavaScript 的可能性,但最近的 JS 顿悟时刻是,我理解了向函数传递参数和 OOP 的一般用法 :-)
好吧,来自 ActionScript 世界(不要讨厌),对我来说,点击的是 DOM 元素就像 MovieClips
你刚刚给了我一个 ActionScript 时刻。太糟糕了,我再也不需要也不想使用它了。
我在各个专业阶段都有过三个主要的顿悟时刻
1. 在学习 JavaScript 之前,代码总是立即执行,唯一的停止是通过用户提示完成的。我的第一个“顿悟”时刻是当我意识到代码可以封装在函数中并附加到某些事件时。
2. 我的第二个“顿悟”时刻是当我能够将 JavaScript 的概念与 DOM 分离时。DOM 操作只是 JavaScript 的一种用途,但它本身并不是 JavaScript。
3. 最后,也是最近,Douglas Crockford 的 Yahoo 视频极大地加深了我对 JavaScript 的理解。当我设法理解原型链并将所有数据和函数视为对象时,jQuery 和其他库所做的神秘事情终于变得有意义了。
对我来说,重要的时刻是当我了解到用于在 JS 中创建对象的模块模式时。那是我第一次接触面向对象的 JS,它将我的代码从一堆函数变成了结构化的 Web 应用程序。
我同意。使用设计模式是我顿悟的时刻。它们对于编写良好的 JavaScript 比对于 PHP 更加重要。开启我大门的那本书是 Dustin Diaz 和 Ross Harmes 编写的 Pro JavaScript Design Patterns。
模块模式,是的!我认为它改变了我对 javascript 的看法。
这里再投一票给模块模式……但是,我发现自己大部分时间都在使用揭示模块模式,具体来说。
我不是 JavaScript 大师……老实说,我不确定什么是闭包……尽管我可能用过它们。到目前为止,我有过两次顿悟。
1. JavaScript 是原型化的……这个词对我来说毫无意义,直到我意识到它意味着“几乎面向对象”。
2. 许多 JavaScript 直接针对 DOM。在 jQuery 出现之前,或者至少在 jQuery 普及之前,我只将其用于计时器等。但是库让很多人比以前更多地使用 DOM。
你有一个 jQuery 的顿悟时刻。JS 的顿悟时刻还没有到来。我同意这里很多人的观点:一切都是对象,闭包,以及当涉及到浏览器交互(jQuery 使其变得非常简单且非常类似于 CSS)时,事件委托是我开始说“YES!”的时候。
每次使用 JavaScript 时,我都会有一个“啊哈!”时刻。每次都一样。每次都是
“啊哈!我对这门语言一无所知!”
:)
(换句话说,我可能每次使用 JavaScript 时都会学到一些东西。)
对我来说也是如此。有一点是肯定的,“啊哈”时刻是神赐予的甜蜜。;)
这就是我创建 http://www.tiljs.com/ 的原因之一,分享我的 JavaScript“啊哈”时刻并从其他人的“啊哈”时刻中学习。我相信我们可以达成共识,JavaScript 有很多技巧和陷阱可以触发“啊哈”时刻。 :)
我多年的Javascript开发经验,尝试去理解JQuery代码并弄清楚发生了什么,最终迎来了我的“顿悟”时刻。我意识到(可能之前也已经知道)我所掌握的Javascript知识可能只有我希望掌握的0.05%。一些真正有才华的天才开发者存在于世,我感谢他们辛勤的工作,帮助塑造了网络。
说真的,一些“顿悟”时刻包括当我阅读如何在JQuery中通过Javascript修改样式,以及了解Pinterest如何使用Javascript和数学来实现Pin重新定位的时候。
我的“顿悟”时刻是当我发现“$”是JQuery函数的名称,你只需向它传递参数,它就会完成所有繁重的工作来查找这些元素/对象。在很长一段时间里,我都在使用JQuery,却并不真正了解它在做什么(是的,我是在学习JS之前学习的JQuery)。
是的!“$”的理解是一个很酷的“顿悟”示例!
仍在等待我的“顿悟”时刻……
Jamie,阅读“jquery types”文章……之后,你的“顿悟”时刻就会到来……
我的“顿悟”时刻是在我需要为一个Magento电子商务网站制作一个使用MySQL数据库的Flash菜单时。当时我同时在学习ActionScript、JavaScript、PHP和MySQL。我使用PHP将菜单项列在一个JS变量中,然后通过ActionScript的externalInterface类读取它。
当我完成并意识到我本可以在没有Flash的情况下使事情变得更简单时,我的“顿悟”时刻就出现了。
我们都喜欢强大的JQuery,但那些从未与纯JS API作斗争,并学习客户端服务器脚本如何工作以及为什么工作的人,在我看来,面对真正的、具有挑战性的Web编程环境的可能性较小。
到目前为止,我已经使用JQuery工作了三年多(另外三年没有使用它),并且很多时候我需要使用我旧的document.getElementById()朋友加载一些东西,或者使用经典的for循环解析XML,或者为我的旧朋友经典数组创建一个CVS文件读取。
总结:为了完全理解JQuery,并因此能够应对任何JQuery未涵盖的情况(即使很难找到,它们也很多),必须具备强大的JS背景。
所以……谁赞同我?:-)
Salvi,这是一个非常好的观点。这有点像想在不学习运球的情况下灌篮。先掌握基础,然后再考虑花式技巧。
但是,我有很多事情要做,时间却很少。我们大多数人必须从自己的起点出发,开始行动。我将坚持使用Coffeescript和JQuery,并从那里开始学习。我没有时间去学习Javascript的基础知识。如果我将来构建的东西把我逼到您描述的困境之一,我会付很多钱请您帮我解决。
Charlie,
我过去也说过同样的话。我在JQuery方面比较强,但在原生JavaScript方面比较弱。在很长一段时间里,我能够用JQuery编写代码并取得预期的结果,但我从未真正理解过它们为什么那样工作。然后我被扔到一个混乱的JQuery和旧式正确编写的javascript环境中,其中包含对象、函数、循环等等。我可以告诉你,我从觉得自己像个天才变成了觉得自己像只挠头的猴子。
我认为JQuery“节省人们很多时间”也是一个误解。在某种程度上,对于某些事情来说,是的,但用标准的JavaScript做一些事情实际上更快,无论是编码方面还是性能方面。
总之,我的意思是不要急于否定基础的JavaScript。当您需要它时,您可能会感到惊讶。
此外,如果您不理解JavaScript的基础知识,您可能正在编写格式糟糕且性能也很差的代码。
给瘪了的轮胎贴创可贴可能会让你到家,但它不会让你到加拿大。
当我意识到几乎所有东西都是对象,如果不是,至少可以像对象一样工作,当然还有“闭包”,一旦你理解了,你就会感觉自己真的了解了这门语言。
我还认为我太晚才注意到javascript具有函数作用域,我希望从一开始就知道这一点:S
到底“this”指的是什么……
喜欢这个。在过去的两个星期里,我两次有了这种顿悟。
1. 如果你调用`setTimeout`,`this`现在引用`window`。所以在函数内部你必须这样做
function someFun(){
var newThis = this;
setTimeout(function(){
alert(newThis);
}, 100);
}
有趣的是,内部函数的作用域是全局的,但你可以在函数内部引用局部变量。奇怪吗?
2. 我最近开始使用Backbone/Underscore,`this`一直在变化,你真的必须跟踪你的作用域
我的“顿悟”时刻是在我不知不觉地使用闭包来解决问题时出现的。我很高兴在苦苦挣扎了很长时间后,我终于对它有了一点了解。在阅读Stefanov的OO Javascript时也有一些“顿悟”时刻……很棒的书。
http://tiljs.com – 好的信息源
我正在做类似的事情,但都是与HTML相关的。
首先,我必须说——我是这里的长期读者/潜伏者,但我必须向你,Chris,表示敬意。你的帖子总是处于最新和最前沿,我无法告诉你我从CSS Tricks中学到了多少。所以,我要感谢你——无数次。
关于这个问题:……当我意识到我没有错过任何分号,并且一切都能按我预期的那样工作时。
仍在等待它,我是一个JQuery和JS的新手……有人可以给我指一条通往兔子洞的道路吗?
你应该看看Jeremy Keith关于Javascript的书,它叫做——“DOM Scripting——使用Javascript和文档对象模型进行Web设计”。我目前正在学习它,到目前为止它教会了我很多!(我也是JS新手)
看看Nettuts的“30天学习JQuery课程”,你可以从那里开始,然后其他一些博客就会开始变得更有意义,直到你有了顿悟时刻,然后它们都会变得有意义。
当你创建一个新对象时,你(或多或少)正在创建其原型的副本。
我的“顿悟”时刻是由几个小的顿悟组成的。其中最大的是在Javascript中创建类的概念。
例如。
你的评论就是一个“顿悟”时刻。我最初认为我的“顿悟”时刻是我访问了自己的自定义数组对象的原型时。但这为我打开了一扇操纵DOM的新大门,我之前从未考虑过。
对我来说,最大的“顿悟”时刻是当我意识到可以使用console.log(something)而不是alert(something)并在控制台中检查它时,我最沮丧的时刻结束了。
第二个是$(this)与'this'的不同之处,有时我对此感到困惑,不得不console.log(this)以确保我走在正确的道路上。
第三个可能是JS的操作,我没想到1 + 1在JS中可以是11(作为字符串类型),而不是2(作为数字)……对我来说,这是一个最酷的“顿悟”时刻。
但这并不意味着我的“顿悟”停止了,我想我可能在未来的新项目中会遇到更多“顿悟”时刻,意识到自己应该知道的东西的那种感觉是如此特别,我迫不及待地想再次体验它。
我学习到像“2.13”这样的字符串可以通过在前面添加+来转换为数字的那一刻。
对我来说,是作用域/闭包。对于新手来说,这是最常见的错误。
@Leo V – 我写了一篇博客文章,从.Net开发人员的角度介绍了JavaScript的基础知识。它可能有助于你入门。Javascript入门
当我意识到你可以对函数调用'new'来将其用作新对象的构造函数时。
对我来说,是在最近参加了这个课程的时候
http://tutsplus.com/course/30-days-to-learn-jquery/
我的顿悟时刻出现在我意识到可以使用 JavaScript 作为 CSS 的“兴奋剂”时:我可以以以前无法实现的方式动态添加/删除类和样式。
虽然很奇怪,但我对 JS 了解得越多,就越觉得还有很多“啊哈”时刻等待着我去解锁。
我最大的三个“啊哈”时刻是
1. 意识到一等函数、原型继承和闭包的组合使得 JavaScript 具有多么强大的灵活性和可塑性。
2. 当我决定编写一个独立版本的库时,这个库最初是依赖于 jQuery 编写的,我编写了自己的超简化版 jQuery,这促使我去阅读 jQuery、Zepto 和 Underscore 的源代码,看看它们是如何实现“魔法”的。
3. 为 Node.js 编写代码。
我的顿悟时刻是当我用原生 JavaScript 创建了一个基于文本的角色扮演游戏。我使用 JS 模拟类来创建引擎中的实体,并使用类成员函数中的函数。这使得游戏制作变得容易得多。
我现在对原生 JavaScript 了解不多,但最近我经历了一个巨大的 jQuery“啊哈”时刻。这都要归功于观看 Nettuts 的“30 天学会 jQuery”课程。我在 30 个课程中的第 9 和第 10 个课程上卡住了,但这主要是因为这些课程对我产生了巨大的影响。我编写 jQuery 已经很多年了,我目前的工作很大一部分是因为我了解 jQuery,但这些课程向我展示的东西让我完全重新思考了编写 jQuery 的方式。
我的“啊哈!”时刻是,我实际上可以干净地组织我的 jQuery 代码。现在说出来,听起来有点显而易见,但它对我的代码产生了巨大的影响。此外,我学习了一些结构技巧(主要来自上述课程),这些技巧有助于我编写更干净的代码。我现在缓存任何需要执行多次的 jQuery 调用,重新思考我使用 jQuery 执行所有操作的方式,更多地使用函数和面向对象编码,作用域变量,更好地控制“this”,以及在逗号分隔列表中定义变量。总的来说,结果是我在很多地方编写了大约 1/4 的代码,并且查找元素的频率降低了大约 1/6。
此外,我刚刚开始编写我的第一个小型 jQuery 插件。当需要反复执行某些操作时,有时我会编写一个小型 jQuery 插件而不是函数,以利用 jQuery 的优势。我开始理解扩展 jQuery 和修改 jQuery 工作方式的含义,并且我终于理解了如何使用 $.extend() 定义默认值并覆盖它们。
所有这些都将我的代码带到了一个全新的高度,具有更好的可读性、更快的执行速度以及更干净、更精简的代码。
我最近的“啊哈”时刻是意识到我实际上对 JavaScript 的了解有多么少!并且意识到学习基础知识以及了解如何使用 jQuery 做一些很酷的事情对我来说都很重要。
另一个“啊哈”时刻是意识到重用和向函数传递内容,同时意识到我的代码有多么冗长和混乱:D 但总的来说,意识到随着我的学习和进步,我还有多少“啊哈”时刻等着我去体验 :)
我学习 JS 是从 jQuery 入门的。对我来说,一个重要的进步是学习如何使用事件,并意识到事件可以手动触发。理解 JS 中的面向对象编程也是一个重要的进步。
当我意识到可以使用 Firebug/Chrome/IE 控制台快速测试任何代码或函数时。
– 如果我不记得该函数是如何工作的,我会在控制台中测试它。
– 如果我不确定语法,我会在控制台中测试它。
– 如果我不知道这段代码是否会起作用,我会在控制台中测试它。
;)
… 当我发现“一切皆为对象”只是一半真相时。
– 解释器是一个巨大的基于事件的 eval 循环,从它的角度来看,一切皆为函数。
在 JS 内部,“eval 是邪恶的”,但
var f = new Function () { ... };
是 FTW(值得一试),var obj = new function() { ... }
也是如此。“new Function () { … }” 不起作用。应该是 “new Function (” … “)”,但这只是 eval 的别名。new Function 存在与 eval 相同的问题。但您可以很容易地创建无 eval 的函数来实现您想要的功能。
(缩进似乎没有保留…)
另一种方法是使用我之前从未见过的单次构造函数,这很有趣。我将把它添加到我的有用模式列表中。
@Havvy:是的,你说得对。应该是
new Function ("...")
。抱歉。但它远不止是
eval()
的别名。eval() 一步到位地实例化和执行,几乎没有机会阻止不良情况发生。
在“创建函数”块内使用封装的 try/catch,您可以验证新函数是否在将其返回到调用上下文之前。
调用它或将其绑定到新上下文是一个完全不同的步骤 :-)
var obj = new function() {...}
构造函数的工作方式几乎与闭包或立即调用的函数相同,但具有一些优点(至少在我看来是这样)。它允许在创建的对象内部使用私有变量和函数,就像其他方式一样,
但访问其调用范围内的变量更可预测(
this
也是如此)。在执行嵌套此类构造函数并仍然能够访问其基本调用范围的变量等疯狂操作时,这非常有用。
这样,您可以轻松地拥有私有、类共享、受保护和公共(从基类角度来看)变量。
但这远远超出了点击查找执行 DOM 操作的范围……
我对 JS 有过很多“啊哈!”时刻,但其中一个最大的时刻是理解 PHP 钩子,它们基本上与 JS 回调非常相似。
我的“啊哈”时刻是当我意识到我可以编写面向对象的 JavaScript 应用程序时。这给了我更多机会去了解 JavaScript 的强大功能。你越深入其中,就越想体验更多。
我的 JavaScript“啊哈!”时刻是当我意识到作用域是如何工作的。
我的顿悟时刻是当我意识到 HTML 元素就是元素,jQuery 可以根据我的需要查找和影响这些元素。如上所述,“查找这个,做那个”。除了操作 DOM 之外,我还没有找到太多 JS 的用途,但我相信总有一天它会发挥作用,我将会有另一个“啊哈”时刻。
当 Douglas Crockford 将立即调用的函数后面的括号称为“狗球”时。
https://#/hK3QZB5r
哈哈哈哈哈!太搞笑了!我喜欢 Douglas Crockford 如何以一种枯燥的编程主题进行演讲,并适时加入一点幽默来吸引观众。
我看到了这个演示文稿,我不同意 Crockford 先生的观点(不仅仅是在这里)。
他说他将括号放在调用外部的原因是整个调用都很重要,而不仅仅是函数。
但这些括号并不是为了显示什么内容很重要。它们是为了确保这是一个**函数**表达式,而不是函数语句。调用始终是表达式,因此无需用括号将其括起来,从而表明这是一个表达式。它只是让人困惑;)
因此,最终像 Crockford 先生那样解释这种情况并不能帮助理解这门语言中真正发生了什么。
对我来说,JavaScript 的“啊哈!”时刻就叫做 jQuery。尽管称之为“啊哈”时刻不太准确,因为了解 jQuery 会让你认为你可以编写 JavaScript,但事实并非如此。
jQuery 通过使用 CSS 选择器和 slideUp/slideDown 等便捷方法,使得 JavaScript 变得非常容易使用。用原生 JavaScript 编写这些代码会很痛苦,而且大多数 jQuery 开发者甚至都不知道从哪里开始。
当然,由于 jQuery 将继续存在,所以这不是什么大问题。只要我们不谈论 JavaScript 性能(和移动端)就可以了。
@bigbossSNK 哈哈,当我观看这个视频时,我笑得前仰后合!#狗球
我的顿悟时刻是我诞生的那一刻。
这正是我每次有人问我如何学习网页设计时都会解释的内容!正是那一刻,你突然明白了它是如何运作的,然后一切都变得如此简单。实际上,我大部分代码都是自己学习的,只是在谷歌上搜索一些简单的东西,比如如何在 php 中获取查询(顺便说一句,那是我顿悟的时刻),然后过了一段时间,我就有点懂这门语言了。
我读过几篇关于闭包的文章,但理解这个概念很困难。有一次我读到,它只是将一个函数返回到全局命名空间,那是我顿悟的时刻!
当我意识到 JavaScript 与 Java 没有关系的时候。
我想在过去的几年里我经历过几次顿悟,但我最期待的是还没有发生的——理解 JavaScript 中的 MVC。
我有一个项目,其中包含了我之前的大多数顿悟时刻,所以我期待花一些时间使用 MVC 概念重新构建它。
对我来说,那一刻是我了解到自动分号插入的时候。
Doughlas Crockford 正确地建议将起始花括号放在同一行而不是新行上。
我一开始使用 jQuery (http://sarfraznawaz.wordpress.com/2012/02/12/learning-javascript/),但自从我开始认真学习 JavaScript 以来,我就爱上了它,并且经历了不止一次的顿悟时刻 :)
仅供参考,以下是在其他哪些地方会发生自动分号插入。
var 语句
空语句
表达式语句
do-while 语句
continue 语句
break 语句
throw 语句
闭包中的作用域的工作方式完全符合你的预期,如果你忘记了面向对象语言强加给你的所有那些无稽之谈。这也使我在 C# 上变得更好,因为我真正理解了 Lambda 表达式。
$.extend
Captain Obvious 关于创建返回其他函数的 JavaScript 函数的帖子。
学习了一点 Prolog,并开始理解布尔类型强制转换 && 和 || 如何与分号密切相关。
DOM 事件冒泡。
哇,我想我已经忘记了我个人的 JS 顿悟时刻了,但我会尝试一些基本的东西。
1. DOM 相关内容(window、document、onclick 等)实际上并不是 JavaScript,它们是浏览器提供给 JavaScript 的东西。这就是 JavaScript 中 99% 的跨浏览器问题所在,在 DOM 之外,相比之下,跨浏览器兼容性方面可谓一帆风顺。
2. 在浏览器中,所有内容都在 window 对象中,所以
可以通过以下方式调用:
或者
3. 点表示法可以与方括号表示法互换,因此你也可以
因此可以通过变量
4. 'in' 不仅用于 for 循环,你还可以将其用作测试。
5. || 和 && 不会返回 true 或 false,它们返回最后计算的操作数。
6. DOM 集合不是数组对象(记住,它们不是 JavaScript),并且执行 getElementsBy…() 会返回一个实时集合。例如,当你引用 .length 时,它会重新执行 getElementsBy…() 以重新计算长度,因此如果你执行以下操作,则会出现无限循环。
呸,我现在只能想到这些,不想说得太复杂。
我是一个相当硬核的软件工程师……我为飞机和潜艇编写过安全关键软件。我仍然没有我的 JS “顿悟”时刻。但我知道那是什么:当我理解该死的作用域规则时。
我想我只是不习惯使用这种类型松散且事件驱动的语言,我不明白什么在作用域内,什么在作用域外,尤其是在将函数作为数据传递给事件时。
我也一直避免在 JavaScript 中编写大型应用程序,因此从未有机会深入研究作用域和闭包的细节。
总有一天。
我更喜欢我的潜艇软件编写人员使用更“好”且防泄漏的东西。
:)
我认为你刚才描述它时给了我顿悟的时刻:
“查找某些内容,执行某些操作”库。
谢谢!(不过我可能还是会让别人来写它,我喜欢 CSS。)
当我意识到它实际上是一种真正正式且复杂的语言,而不是在浏览器客户端中运行的讨厌的小脚本(我最初几年作为 Web 开发人员时对它的看法)的时候。
对我来说,JS 是
原型继承的
基于事件的(这与……很不错)
有闭包
最终给了我顿悟的时刻。
哦,还有头等函数。
我的顿悟时刻是我了解到 Ctrl F5 可以刷新浏览器中的 JavaScript 的时候。当然,那是很久以前的事了。
我在 JavaScript 中的“顿悟时刻”是我意识到 JavaScript 中的所有东西都是对象(我知道这听起来很傻……),就像 CSS 中许多盒子里面还有更小的盒子一样……
jQuery 是一个很棒的库,仅仅因为它帮助开发者培养了一种关于 JavaScript 的新思维方式。所有其他特性都很棒,但它们并不是使其出色的独特特征!
一个月或两个月前,在此之前我一直只是磕磕绊绊地学习。
它已经消失了,html -> css -> php -> Javascript -> Jquery
我认为我快接近“顿悟”时刻了,但现在仍然在浏览和自定义开源代码。我喜欢 jQuery!
函数式/逻辑编程;闭包;对象,到处都是对象。
我喜欢 JavaScript 的“顿悟”时刻是如何倾向于相互否定的。
“啊哈!就是这样强迫它执行 X 而不是 Y!”
“啊哈!Y 实际上比 X 好得多!”
我想最大的顿悟时刻是观看 Crockford 的视频,并意识到它并没有坏,只是不常规,如果与语言作斗争,那么可能会有更好的方法来做事。
伙计,我上周末在航班上读那本 jQuery 书的时候就有了顿悟的时刻!太棒的感觉了。不知道为什么我之前一直犹豫不决开始学习它……
当我看到我自己的函数就像 JS 的内置函数一样使用 prototype 属性时,我真的很喜欢它。
而且我真的很高兴知道我无需在我的系统中安装任何东西即可使 JSON 正常工作!哈哈!
对我来说,是阅读
DOM 脚本编程:使用 JavaScript 和文档对象模型进行网页设计
作者:Jeremy Keith
我仍然向任何刚开始学习 JavaScript 的人推荐这本书。
同意——这是一本非常适合入门的好书,Jeremy 有着令人惊叹的方式让事情变得易于理解,尤其是在你更多地来自设计背景的情况下 :)
在不同的阶段会有不同的“顿悟”时刻。我的第一个时刻非常类似于 Chris 的,只是我没有读一本书,而是盲目地使用了一个插件,该插件没有完全按照我想要的方式工作。我决定查看代码,由于它是 jQuery(使用了类似 CSS 的选择器),因此非常直观。我只需要更改插件期望某个 ID 的位置以期望某个特定类,它就可以工作了。我可以更改正在查找的内容,并且可以使不同的事件发生。啊哈!
大约在同一时间,传递值和对象的方式变得很清楚。几天来,老实说,当我在示例代码中看到类似 function(foo, bar) 的函数时,我以为 'foo' 和 'bar' 具有某种意义,我必须弄清楚哪些有效值可以放在那里。;-) 不久就拍了一下额头,但这让我一开始就陷入了困境,完全没有开发背景。
其他学习内容是渐进的。随着我学习和在适当的时候开始融入“原生”JavaScript(例如,this.id 与 $(this).attr('id')),理解如何解决时间问题并解决竞争条件。
然后,当我试图解决另一个问题(应用程序命名空间以避免污染全局命名空间)时,我终于真正理解了对象。所以这确实是第二个“顿悟”时刻。从那以后,我进入了另一个渐进学习阶段,但我相信另一个顿悟时刻不会太远。
作用域。
1) DOM
2) 匿名函数
3) Coffeescript
– 匿名函数
– 一切都是对象
– 函数作用域
– 闭包
– 自执行函数
意识到这一切都与DOM有关,访问它的元素并以某种方式操作它们,无论是改变某些东西的外观,向其中添加元素还是删除元素。从那里,一切都简化为一个问题,即确定我想处理的元素,它们的最终状态应该是什么以及我想对它们做什么,以及如何去做。简单。
我的理解是javascript中“var”关键字的使用、变量提升、作用域和原型继承。
发现null、undefined、0、false(当然)和""都是假值,并且
足以测试假值变量!\o/
一连串的顿悟
– 当然,一切皆对象的概念
– 使用括号进行对象声明和实例化的简写形式
– 通过使用json/jsonp打破同源策略
虽然不是“现在我明白了”的体验,但我最喜欢的一个是,你可以完全绕过xmlhttp,重新使用已知脚本对象的src属性。只要你可以将其编码为js,就可以从任何地方获取任何东西。最后我的阅读器网络应用成为可能。目前正在通过它阅读此博客……
我的javascript顿悟时刻是jQuery
当我弄清楚javascript中变量作用域是如何工作的时。就像当你设置一个变量然后是一个闭包,然后无论何时调用该闭包,它都可以访问该变量。
当我意识到可以将参数传递给函数时
</code.
当我意识到
函数也是对象……
和你一样,克里斯,发现了jQuery及其所有功能和能力。在此之前,JS 是一团迷雾,之后它变得易于访问。现在我正在学习越来越多的“核心”JS。 :)
当我想更改整个表单div的背景颜色以聚焦任何输入时,jQuery 的强大功能让我惊呼“耶!”,我试图用CSS来做(无法做到),因为页面中有多个表单。所以我使用了
因为我想应用颜色的div是“this”输入的第三个父元素。我仍然在等待此纯CSS解决方案。
仍在等待它。我仍然无法完全理解javascript中进行的对象类型面向对象编程。我对Java、Python、PHP甚至Lua风格的面向对象编程没有问题,但JS却让我头脑混乱。
在我阅读了Stefanov的书之前,我完全有同样的感觉(我喜欢Crockford,但他总是让它听起来好像JS中有一些隐藏的天才)。
我的顿悟在于,在JS中,面向对象编程有点由你决定。这只是一个实现问题,你可以用它来实现类似面向对象的效果。如果你来自使用指针的语言,可以将JS对象视为始终带有三个指针的结构:构造函数、原型和__proto__。现在,在创建新实例时,将这些指针指向不同的位置,你就可以获得不同类型的“继承”。一个非常强大而灵活的机制——毫无疑问——但也非常容易出错。所有这些都可以在没有任何语言的原生面向对象元素的情况下完成。我喜欢它,即使对于原型继承(它应该在JS中是原生的),Crockford总是有一种当前最喜欢的实现方式——http://javascript.crockford.com/prototypal.html。或者那里唯一其他的原生面向对象的东西——“new”运算符被一些人认为是有害的——http://stackoverflow.com/questions/383402/is-javascript-s-new-keyword-considered-harmful?另一方面,部分原因是这使得像jQuery这样的美丽事物成为可能……
了解如何使用函数作用域实现信息隐藏。
在自定义iphonel u的音频播放器以及我的日常工作中,为mobifreask的免费移动网站模板上的下拉菜单添加onclick事件时,我发现了js和jquey的重要性。
正如这里其他人提到的,对我来说,是观看和阅读Crockford。当我阅读该语言的历史/背景时,一切都变得更有意义了——我不再像以前那样仅仅使用Java/C思维方式来破解语言而感到沮丧和困惑。
他解释说:“JavaScript的类似C的语法……使其看起来像是一种普通的过程式语言。这是误导,因为JavaScript与Lisp或Scheme等函数式语言的共同点多于与C或Java的共同点。”
显然,该语言被命名为JavaScript作为一项营销活动,因为Java当时是“它”。非常令人困惑的名称选择!
说到javascript,我在ie7中查看此网站时出现js错误。我认为你的js中缺少或多了一个逗号。
我最大的Javascript“顿悟时刻”是我发现必须在AJAX回调中定义函数,以便新加载的内容可以访问你的函数。
我的“顿悟!”时刻是我朋友告诉我一个名为jQuery的新框架正在开发的那一天。
我还没有体验过我个人对javascript的“顿悟”时刻,但类似的还有我对面向对象设计的“顿悟”时刻。我整个晚上都在努力让一些代码工作,然后去睡觉了。我在半夜醒来,对自己说……“等等!我明白了!”。我意识到我一直都在用一些杂乱的过程式-面向对象-意大利面条式的混乱代码摸索着。我突然理解了创建一次对象并在整个站点或我的任何站点中使用的整个概念。我知道编写一个自包含的类意味着什么,它可以在我需要的任何地方使用,在我的所有项目中使用。对我来说就像是一种范式转换。这是一种很酷的感觉。
当我意识到我可以使用jQuery,但不能使用原生JavaScript时,我有了“顿悟!”。我仍然不确定这是好事还是坏事——但它对我有用。
我恰恰相反。我知道jQuery的使用方法,但除非客户要求,否则我随时都会选择原生Javascript而不是库。
是的,我知道风险(主要是浏览器不一致),但我还没有看到一个像样的库真正鼓励以它应有的方式使用Javascript。我对它们的问题更多的是关于它们背后的思维方式,而不是框架本身。
Javascript不应用于动画或样式;应该使用CSS。它不应用于内容生成或脚本加载;应该为此使用服务器端语言或仅使用HTML。最重要的是,网站不应依赖Javascript来运行(除非在特殊情况下,例如Gmail或类似的东西)。
最糟糕的是,尽管框架本身很少那么大,但依赖它们会很快使网站膨胀。我们公司的“移动网站”必须加载超过1MB的JS库才能运行,并且其感知加载时间是桌面网站的3倍。
我想说的是,如果可能,了解基础知识是好的。
我编写了一个非常小而基本的jQuery截断函数(http://martoosterveld.nl/blogdetail.php?id=27)。那是我顿悟的时刻;从那时起,我在JS和jQuery方面变得越来越好。还有很多东西要学习,但这绝对是我良好JS职业生涯的开始:)
首先,当我意识到有两种方法可以访问对象属性时
然后,当我意识到第二种类型甚至不需要使用字符串时
或者也许
甚至
小心,你在括号中使用的对象将使用其字符串表示形式进行索引(将调用toString()),因此,如果结果为“object Object”,并且你没有意识到这一点,那么你可能会遇到一些意外的冲突。
嗯,这很有趣,我不知道这一点,谢谢 :)
当我发现getElementsByTagName是一个实时集合时
http://devign.me/getelementsbytagname-is-always-up-to-date-according-to-the-current-dom-tree/
对我来说,那是当我发现可以使用debugger;在Firebug控制台中调试JavaScript的那一刻。
好文章!以下是一些关于如何在网页设计领域提升自己的技巧网页设计
1. 通过设计博客了解最新资讯,或者学习一门新的网页语言。
2. 市面上有很多很棒的网页设计书籍和杂志,涵盖了广泛的主题,并作为教育资源不断加深。
3. 像Six Revisions这样的网络资源非常适合学习新技巧。
4. 记住要验证你通过第三方资源学到的任何内容。外面有很多过时的信息(比如W3Schools),可能会让你养成坏习惯。
5. 网站开始教授课堂风格的课程和基于视频的教学课程(例如Lynda.com)关于网页设计和开发。它们可能价格不菲,但将是你未来最好的投资。
啊哈!数字、布尔值、字符串等。
啊哈!if else
啊哈!for / while循环
啊哈!函数、对象、方法
在我完全掌握这门语言的语法之前,还会有更多“啊哈”时刻。对我来说,最重要的“啊哈”时刻将是,当我意识到我可以对DOM做什么的时候。对我来说,因为我不编写真正的计算机程序,所以最重要的是我可以用JS对我的网页设计做什么。为了以最佳、最简洁和最轻量的方式做到这些,我认为每个人都必须了解纯JS是如何工作的。
学习JavaScript的一个非常好的资源是codeacademy,我目前正在使用它。对我来说,从来没有比这更容易学习与网络相关的技术了,所以我真的可以向每个人推荐它。
这个帖子最终成为了一个极好的工具,可以为jQuery/未来纯JavaScript开发者编制阅读清单。高级JavaScript开发者提到的让他们更上一层楼的反复出现的主题,真的激励我去学习,并给了我一些很棒的方向来做到这一点。
我意识到
this
和$(this)
之间区别的那一刻。我不会说我对Javascript有“相当的理解”,或者任何其他东西,但观看Douglas Crockford的一系列演讲让我大开眼界。虽然我的代码仍然一团糟,但至少我知道它哪里不好(至少在某种程度上),更重要的是,我现在可以想出一些东西并让它以某种形式工作,而不会太痛苦——而不是最多修改复制粘贴的代码,而几乎不知道它是如何以及为什么工作的,最糟糕的是只能勉强通过。
http://yuiblog.com/crockford/
^ 它们也在YouTube上。如果你像我一样,你可能会对其产生类似发烧的反应:无法停止观看,同时感到需要将你听到的内容付诸实践,这有点像需要打喷嚏和小便同时进行。有史以来最好的脑力疼痛!就我个人而言,我期待着将来某个时候再次观看它们,并且能够稍微跟上节奏,那也将非常棒。
希望这对任何人都有所帮助,无论如何都要感谢Crockford。
我的“啊哈”时刻是学习JQuery。我想你可以说我还在等待……
当我使用alert类型的验证,而我的老师告诉我使用更好更时尚的验证,并且它第一次就成功了。
好吧,它不像那样“啊哈”,所以我还在等待。
到目前为止最大的“啊哈”——我们被它困住了……(所以最好学习它)
我的“啊哈!”时刻绝对是我掌握“this”概念的时候,在javascript和php中都是!这是一个如此简单的概念,但一开始却很难理解。一旦我搞懂了,我的编程生活就变得容易多了。
我不是专业人士或类似的人,但我可以说那一刻出现在我弄清楚如何使用JavaScript/jQuery显示来自其他页面的数据之后,经过几周的搜索。
我的“啊哈”时刻是我了解了JS中真值和假值表达式的强大功能和易用性。不再使用“if (x == “” || x ==0 || typeof x == “undefined”)”,现在我可以只使用“if (x)” #booyah
jQuery 啊哈!
– 链式调用和回调函数。
Javascript 啊哈!
– 对象是如何工作的以及如何使用它们。
– DOM是什么以及它是如何工作的
我还在等待“啊哈”时刻。我阅读教程,观看视频,但我仍然无法理解Jquery。我的意思是,我可以做一些简单的事情,比如隐藏和向下滑动,但除此之外,我无法再进一步。我不知道是什么……我甚至不知道什么是对象!哎。悲伤。
我在这里也遇到了同样的麻烦,我似乎可以管理一些小事情,比如滑动、隐藏等,但除此之外什么也做不了,我渴望得到这个“啊哈”时刻,我正在观看视频教程,阅读书籍,尝试过code academy,但似乎没有一个对我有效((( 我在这里询问过建议,但没有人回答,请大家如果有任何捷径或提示、技巧、教程,请发布……
Leo,
你有没有尝试过与其他人见面,并尝试在小组环境中学习?
对我来说,帮助我的是决定在学校参加一个课程来学习基本原理,这真的帮助我更好地理解了正在发生的事情。
在此之前,我尝试了你描述的所有方法,但没有一个奏效。我认为这归结于了解自己以及你如何最好地学习。
我还有很长的路要走,还有很多不眠之夜,但我正在打下良好的基础。
这些时刻与“恍然大悟”的时刻惊人地相似。对我来说也是如此,我很快就了解到一切都是对象……
然后你认为你已经掌握了,你开始尝试一些东西,然后砰!命名空间与插件或其他代码片段冲突——你又回到了谦卑的状态……你了解了命名空间和闭包之类的东西……
然后是“this”——你想“this”到底是什么,哦,天哪,我花了很长时间才“理解”这个,或者说是“理解这个”,或者可能是理解“这个”,有一件事是肯定的,那就是当你理解这个的时候,你就理解了。
我还在“学习”JS,但对我来说,我遇到的最大的“啊哈”时刻是我弄清楚if/else语句是如何工作的(就像PHP一样!),如何使用console.log(),以及JS本质上只是变量和函数——按这个顺序。
我正在努力实现我的下一个“啊哈”时刻,通过深入研究封装 :)
对我来说,那是当我找到phpjs.org的时候。
所有PHP函数都转换为JavaScript……。
我认为Chris对jQuery的解释给了我jQuery的“啊哈”时刻。
我的“啊哈”时刻是Javascript中的原型。我已经从探索Ruby中了解了“一切都是对象”,所以这很有道理——真正让我对Javascript感到困惑的是没有类。然后我读了Javascript:The Good Parts,他阐明了Javascript的原型特性。
那时我的脑海中闪过一丝灵感(当时我也在阅读进化论),我将原型与“最近的共同祖先”联系起来,它真的就豁然开朗:通过沿着链条向下找到应该承载扩展的原型对象来扩展一个类,并从此处开始发散。
实际上,Javascript:TGP的全部内容都是“哦,原来是这样”的时刻。
对象作用域,“随时了解*this*指的是什么”,以及DOM事件系统,“学习如何#addEventListener”。
无论如何,我现在使用CoffeeScript,它确实简化了一切。
在CoffeeScript中,类似这样的代码……
变成这样…
最令人惊奇的事情是,像这样的东西…
可以这样写…
原型继承可能是我最难理解的概念之一,但一旦我意识到这种范式是如何工作的。我一直希望JavaScript能够简洁且基于类,但原型链为编程提供了新的视角。
发现jQuery可以摆脱这种混乱。
我很久以前就开始学习JavaScript了,现在已经超过10年了,早在我第一次连接互联网之前。我学习的内容是一个简单的JavaScript Web教程,压缩在软盘上,以及计算机杂志上的一个教程。正因为如此,我主要是在自己摸索语言,所以有很多“啊哈!”时刻。
我当时的代码一团糟(空格和换行符?谁需要它们!代码越能填满屏幕越好),但奇怪的是,我完全知道那里发生了什么。
我没有使用
var
语句,因为我没有看到它与简单地使用变量之间的区别。后来我发现,函数中的属性具有无法在函数之外看到的奇怪能力。所以,我开始像这样使用它以我现在的编写风格,它看起来像这样
然后我又尝试了
var
。这可能是我最大的“啊哈!”时刻。
我最新的“啊哈!”时刻是关于这个的
是的,评论有点太长了,但我希望你喜欢它:)
(object.method || function(){})(param);
为什么不能按预期工作?也许你的预期是错误的,但它确实做了你告诉它做的事情。(尽管它似乎偏爱匿名函数,而匿名函数是可通过名称引用的函数的糟糕替代品)。好吧,正如你从第二行看到的,我对这次调用的效果的预期是不同的。也许我没有表达清楚,我应该写成“……正如我预期的那样”。
“糟糕的替代品”是什么意思?性能问题?好吧,性能在那里并不那么重要,所以我以一种易于我理解的方式编写了代码。我经常使用
(object.notSureIfThisPropertyWillExist || {}).foo
这样的构造,所以我想对方法使用类似的东西。也许我应该开始使用一些全局范围的空操作函数,但目前我还没有感觉到需要这样做。无论如何,我已经选择了第三种选择(实际上是第二种)。但请随意批评我的代码/风格/习惯。我很乐意学习更多东西,从而成为一名更好的程序员。
干杯。
不,不是这样。我的意思是语句
(x || y)()
表示“调用x,如果它不存在,则调用y”。在你的例子中,x是对象上的一个函数,你可以多次调用它(这就是公共函数的意义所在,对吧?),但y不是。这个问题通常这样解决:if(!x) x = y;
,它表示“如果x不存在,则y等于x”——大多数垫片都是这样工作的。但那不是垫片。我不想用空操作替换那个不存在的方法。
这个表达式的作用更类似于try语句(或PHP中的@)。try语句被认为相当缓慢,建议在最顶层作用域中使用(我在那里使用了它),这里没有那么必要,因为我可以使用if或||或&&进行检查。
你说
“在你的例子中,x是对象上的一个函数,你可以多次调用它(这就是公共函数的意义所在,对吧?),但y不是。”
这正是我想要达到的目标。那里的空操作函数不打算在任何时候被调用。它只是为了预防,所以当它碰巧被调用时,程序会继续执行,而不是抛出“TypeError: undefined is not a function”(尤其是在代码在服务器端执行时,就像这里一样)。
我希望这能澄清一些事情。感谢你的评论,我非常感谢。我可以向你保证,当一些代码被多次执行时,我会尝试为它找到内存中的一些舒适位置:)
干杯。
附注:我误点了鼠标,这条评论被发布到了主线程。请忽略它。抱歉^_^’
哦,我现在明白混乱可能来自哪里了。我展示了一个通用的例子
我只是想引起人们对调用方法的注意。实际上,它看起来有点不同
从不同的角度来看,它可能看起来像我试图实现其他目标。
尽管如此,这仍然可能让人感到困惑,为什么我甚至要尝试这种方法。但相信我,在上下文中,它比你想象的更合适。
干杯。
精彩的文章。令人难以置信的是,有多少人经历了同样的体验。
我也有一些“啊哈!”时刻。我的第一个时刻是,当我发现jQuery并不是什么外星语言,并且非常容易理解。
但那不是垫片。我不想用空操作替换那个不存在的方法。
这个表达式的作用更类似于
try
语句(或PHP中的@
)。try
语句被认为相当缓慢,建议在最顶层作用域中使用(我在那里使用了它),这里没有那么必要,因为我可以使用if
或||
或&&
进行检查。你说
这正是我想要达到的目标。那里的空操作函数不打算在任何时候被调用。它只是为了预防,所以当它碰巧被调用时,程序会继续执行,而不是抛出“TypeError: undefined is not a function”(尤其是在代码在服务器端执行时,就像这里一样)。
我希望这能澄清一些事情。感谢你的评论,我非常感谢。我可以向你保证,当一些代码被多次执行时,我会尝试为它找到内存中的一些舒适位置:)
干杯。
上面的评论本应该是一条回复,我把它发布在了上面,所以你可以忽略或删除它(如果你能做到的话)。抱歉造成的不便,是我的错^_^’
:) 这是你第一次提到空操作!!!我没有把你的空函数理解成字面意思,我以为是为了简洁起见。是的,我个人认为
if(x) x();
没有什么问题。我的意思是,与x && x()
相比,这对那些没有将JavaScript作为第一语言的开发人员来说不是一件好事。我的“啊哈!”时刻应该是学习了异步xml/http请求是多么容易。
—–
var req = (window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject(“Microsoft.XMLHTTP”);
if(req == null) throw “Error!”;
req.onload = function() {console.log(“Success!”);}
try {
req.open(“POST”, address, true);
req.send(data);
} catch(e) {throw “Error!”;}
—–
很长一段时间以来,我一直认为AJAX是某种需要高级框架才能实现的令人惊叹的JavaScript“东西”。
我之后还有一个(有点令人不安的)“啊哈!”时刻,当时我发现大多数使用“AJAX”的库鼓励使用它将原始HTML/Javascript注入网页(错误解析和安全漏洞比比皆是!)。
我的“啊哈!”时刻是我读到,虽然面向对象编程在状态上添加行为(方法),但JavaScript函数式方法恰恰相反:允许状态进入函数。
当我尝试创建自己的手风琴脚本时,因为我发现jQuery中的那个脚本有点难以设置。
我甚至不知道如何编写任何JavaScript代码,所以这意味着要阅读文档并学习这门语言。