您认为每个程序员应该知道哪些JavaScript的"隐藏功能"?
在看到以下问题的答案的优秀质量后,我认为是时候向它询问JavaScript了.
虽然JavaScript现在可以说是最重要的客户端语言(只是问谷歌)但令人惊讶的是,大多数网络开发人员都很少理解它的实力.
原型系统看起来比传统的类系统更灵活,但人们似乎对所谓的"最佳实践"感到满意,它模仿了传统的类系统:
function foo() {
// define instance properties here
}
foo.prototype.method = //define instance method here
new foo()
Run Code Online (Sandbox Code Playgroud)
原型系统必须具备其他所有灵活性.
在模仿课程之外是否有用于原型系统的用途?什么样的东西原型可以做哪些类不能,或者没有?
2每次都会发出以下警报.
function timer() {
for (var i = 0; i < 3; ++i) {
var j = i;
setTimeout(function () {
alert(j);
}, 1000);
}
}
timer();
Run Code Online (Sandbox Code Playgroud)
不应该var j = i;设置j进入setTimeout的个别范围?
如果我这样做:
function timer() {
for (var i = 0; i < 3; ++i) {
(function (j) {
setTimeout(function () {
alert(j);
}, 1000);
})(i);
}
}
timer();
Run Code Online (Sandbox Code Playgroud)
它提醒0,1,2像它应该.
有什么我想念的吗?
我发现不做的事情比学习应该做的更难学习.
根据我的经验,专家和中间人之间的区别在于能够从各种看似相同的方式中做出相同的选择.
那么,谈到JavaScript,你应该做什么样的事情以及为什么?
我能够为Java找到很多这些,但由于JavaScript的典型上下文(在浏览器中)与Java非常不同,我很想知道它会发生什么.
我最近发现在javascript中,可以执行以下操作:
with document{
write('foo');
body.scrollTop = x;
}
Run Code Online (Sandbox Code Playgroud)
这样做的缺点是需要检查每个变量以查看它是否属于文档对象,从而产生显着的开销.
或者,可以做这样的事情:
var d = document;
d.write('foo');
d.body.scrollTop = x;
Run Code Online (Sandbox Code Playgroud)
是否有任何情况下使用'with'关键字是合理的?
任何人都知道JSLint的"容忍愚蠢"选项是什么意思?它禁用了哪些警告系列?
我发现了一些Node.js和"Sync"方法的参考(包括Crockford的评论"它的名字非常好"),但没有明确的答案.
谢谢.
我有一个javascript文件,读取另一个文件,其中可能包含需要eval() - ed的javascript片段.脚本片段应该符合javascript的严格子集,这限制了它们可以做什么以及它们可以更改哪些变量,但我想知道是否有某种方法可以通过阻止eval在全局范围内查看变量来强制执行此操作.类似于以下内容:
function safeEval( fragment )
{
var localVariable = g_Variable;
{
// do magic scoping here so that the eval fragment can see localVariable
// but not g_Variable or anything else outside function scope
eval( fragment );
}
}
Run Code Online (Sandbox Code Playgroud)
实际的代码不需要看起来像这样 - 我对任何和所有带闭包的奇怪技巧都是开放的等等.但我确实想知道这是否可能.
请任何人共享代码,以便在JavaScript中查找上个月的当前日期的第一个日期.例如,如果当前日期是2009年1月25日,那么我应该将2008年12月1日作为结果.
目标
我想动态地将事件处理程序分配给整个站点的页面上的某些div.
我的方法
我使用jQuery绑定匿名函数作为选定div事件的处理程序.
问题
代码迭代div名称和相关URL的数组.div名称用于设置绑定目标,即将此事件处理程序附加到此div事件.
当事件处理程序成功绑定到每个div事件时,由这些事件处理程序触发的操作只会定位到数组中的最后一项.
所以我的想法是,如果用户将鼠标放在给定的div上,它应该为该div运行一个滑出动画.但相反,鼠标悬停在div1(rangeTabAll)上会触发div4的滑出动画(rangeTabThm).对于div 2,3等也是如此.顺序并不重要.更改数组元素,事件将始终以数组div4中的最后一个元素为目标.
我的代码 - (使用jQuery)
var curTab, curDiv;
var inlineRangeNavUrls=[['rangeTabAll','range_all.html'],['rangeTabRem','range_remedial.html'],
['rangeTabGym','range_gym.html'],['rangeTabThm','range_thermal.html']];
for (var i=0;i<inlineRangeNavUrls.length;i++)
{
curTab=(inlineRangeNavUrls[i][0]).toString();
curDiv='#' + curTab;
if ($(curDiv).length)
{
$(curDiv).bind("mouseover", function(){showHideRangeSlidingTabs(curTab, true);} );
$(curDiv).bind("mouseout", function(){showHideRangeSlidingTabs(curTab, false);} );
}
}
Run Code Online (Sandbox Code Playgroud)
我的理论
我要么没有看到一个令人眼花缭乱的语法错误或它的引用问题.最初我有以下语句来设置curTab的值:
curTab=inlineRangeNavUrls[i][0];
Run Code Online (Sandbox Code Playgroud)
因此,当发生问题我计算过,我改变了(通过for循环迭代)的参考curTab,我实际上改变了以前所有的匿名函数事件处理新curTab价值,以及参考....这是为什么事件处理程序始终以最后一个div为目标.
所以我真正需要做的是将curTab 值传递给匿名函数事件处理程序而不是curTab 对象引用.
所以我认为:
curTab=(inlineRangeNavUrls[i][0]).toString();
Run Code Online (Sandbox Code Playgroud)
会解决问题,但事实并非如此.同样的交易.所以很明显我错过了关于这个问题的一些关键,也许是非常基本的知识.谢谢.
javascript closures anonymous-function pass-by-reference pass-by-value
我看到了JavaScript代码with.这有点令人困惑.它做了什么以及如何正确使用?
with (sObj) return options[selectedIndex].value;
Run Code Online (Sandbox Code Playgroud)