小编Koo*_*Inc的帖子

带有id的DOM树元素是否成为全局变量?

研究一个简单的HTMLElement包装器的想法我偶然发现了Internet Explorer和Chrome的以下内容:

对于DOM树中具有ID的给定HTMLElement,可以使用其ID作为变量名来检索div.所以对于一个喜欢的div

<div id="example">some text</div>
Run Code Online (Sandbox Code Playgroud)

Internet Explorer 8和Chrome中,您可以执行以下操作:

alert(example.innerHTML); //=> 'some text'
Run Code Online (Sandbox Code Playgroud)

要么

alert(window['example'].innerHTML); //=> 'some text'
Run Code Online (Sandbox Code Playgroud)

那么,这是否意味着DOM树中的每个元素都转换为全局命名空间中的变量?它是否也意味着可以使用它作为getElementById这些浏览器中方法的替代品?

javascript dom global-variables identifier getelementbyid

341
推荐指数
5
解决办法
4万
查看次数

为什么typeNNN会返回"数字"?

只是出于好奇.

typeof NaN数字似乎不合逻辑.顺便说一句,就像NaN === NaNNaN == NaN返回虚假一样.这是javascript的特点之一,还是有理由这样做?

编辑:谢谢你的回答.尽管让人们感到高兴并不容易.阅读答案和维基我理解得更多,但仍然是一句话

与NaN进行比较时,即使与自身进行比较,也会返回无序结果.比较谓词是信令或非信令,信令版本表示这种比较的无效例外.等式和不等式谓词是非信令的,因此x = x返回false可用于测试x是否是安静的NaN.

只是让我头晕目眩.如果有人能用人类(而不是数学家)的可读语言翻译,我会感激不尽.

javascript nan

153
推荐指数
6
解决办法
6万
查看次数

Chrome:在后台标签中暂停超时/间隔?

我正在测试setTimeout使用测试的准确性.现在我注意到(正如预期的那样)setTimeout并不是非常准确,但对于大多数设备并不是非常不准确.现在,如果我在Chrome中运行测试并让它在后台标签中运行(那么,切换到另一个标签并在那里浏览),返回测试并检查结果(如果测试完成),它们会发生显着变化.看起来超时运行速度慢得多.在FF4或IE9中测试没有发生这种情况.

因此,看起来Chrome暂停或至少减慢了无法关注的标签中的javascript执行速度.关于这个问题在网上找不到多少.这意味着我们无法运行后台任务,例如使用XHR调用定期检查服务器,并且setInterval(我怀疑看到相同的行为setInterval,如果有时间,我会编写测试).

有没有遇到过这个?这种暂停/减速会有解决方法吗?你会把它称为一个错误,我应该这样提交吗?

javascript tabs google-chrome settimeout

117
推荐指数
4
解决办法
8万
查看次数

为什么array.push有时比array [n] = value更快?

作为测试一些代码的副作用,我编写了一个小函数来比较使用array.push方法与直接寻址(array [n] = value)的速度.令我惊讶的是,推送方法通常表现得更快,特别是在Firefox中,有时在Chrome中.只是出于好奇:任何人都有解释吗?您可以在此页面找到测试(单击"数组方法比较")

javascript browser arrays performance firefox

69
推荐指数
4
解决办法
3万
查看次数

为什么4不是Number的实例?

只是好奇:

  • 4 instanceof Number => false
  • new Number(4)instanceof Number => true?

为什么是这样?与字符串相同:

  • 'some string' instanceof String 返回false
  • new String('some string') instanceof String =>是的
  • String('some string') instanceof String 也返回false
  • ('some string').toString instanceof String 也返回false

对于对象,数组或函数类型,instanceof运算符按预期工作.我只是不知道如何理解这一点.

[ 新见解 ]

Object.prototype.is = function() {
        var test = arguments.length ? [].slice.call(arguments) : null
           ,self = this.constructor;
        return test ? !!(test.filter(function(a){return a === self}).length)
               : (this.constructor.name ||
                  (String(self).match ( /^function\s*([^\s(]+)/im )
                    || [0,'ANONYMOUS_CONSTRUCTOR']) [1] );
}
// usage
var Newclass = function(){};  // anonymous Constructor …
Run Code Online (Sandbox Code Playgroud)

javascript

64
推荐指数
2
解决办法
3万
查看次数

Function.prototype.bind

关于EcmaScript-5 Function.prototype.bind实现,我有一个非常有趣的问题.通常在使用bind时,您可以这样做:

var myFunction = function() {
    alert(this);
}.bind(123);

// will alert 123
myFunction();
Run Code Online (Sandbox Code Playgroud)

好的,这很酷,但是当我们这样做时会发生什么?

// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... 123!
myFunction();
Run Code Online (Sandbox Code Playgroud)

我理解,就Function.prototype.bind的实现方式而言,这是完全合乎逻辑的行为(https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind).但在现实生活中,这种行为完全没用,不是吗?问题是:是bug还是功能?如果它是一个错误,为什么它没有提到?如果它是一个功能,为什么那么具有原生"绑定"实现的谷歌浏览器的行为完全相同?

为了更清楚,我认为更有意义,这里是实现Function.prototype.bind的代码片段有点不同:

if (!Function.prototype.bind) {
    Function.prototype.bind = function() {
        var funcObj = this;
        var original = funcObj;
        var extraArgs = Array.prototype.slice.call(arguments);
        var thisObj = extraArgs.shift();
        var func = function() {
            var thatObj = thisObj;
            return original.apply(thatObj, extraArgs.concat(
                Array.prototype.slice.call(
                    arguments, extraArgs.length
                )
            ));
        };
        func.bind = function() {
            var args = Array.prototype.slice.call(arguments); …
Run Code Online (Sandbox Code Playgroud)

javascript bind function ecmascript-5

22
推荐指数
1
解决办法
1万
查看次数

为什么String(null)有效?

null并且undefined没有toStringvalueOf方法.Afaik使用String调用toString其参数的方法(例如String({})=> [object Object]).

那为什么String(null)String(undefined工作呢?它没有含蓄地做Object.prototype.toString.call(null).因为评价为[object Null].

[编辑]:来自规范ECMA-262 /第5版(第48页).这不会增加澄清,我会说:

/*
Table 13 — ToString Conversions  
-------------------------------------------------------------------------
Argument Type  | Result  
-------------------------------------------------------------------------
Undefined      | "undefined"
Null           | "null"  
Boolean        | If the argument is true, then the result is "true".
...            | ...
*/
Run Code Online (Sandbox Code Playgroud)

javascript string null tostring

22
推荐指数
1
解决办法
3万
查看次数

监控location.hash是XHR应用程序中的历史解决方案吗?

众所周知,在XHR(又名AJAX)Web应用程序中,没有为您的应用程序构建历史记录,单击刷新按钮通常会将用户移出他/她当前的活动.我偶然发现了location.hash(例如http://anywhere/index.html#somehashvalue)来规避刷新问题(使用location.hash通知你的应用程序它的当前状态并使用页面加载处理程序来重置该状态).这真的很好很简单.

这让我想到使用location.hash来跟踪我的应用程序的历史记录.我不想使用现有的库,因为它们使用iframe等.所以这是我的镍和硬币:当应用程序页面加载时我开始这样:

setInterval(
       function(){
           if (location.hash !== appCache.currentHash) {
               appCache.currentHash = location.hash;
               appCache.history.push(location.hash);
               /* ... [load state using the hash value] ... */
               return true;
           }
           return false;
       }, 250
 );
Run Code Online (Sandbox Code Playgroud)

(appCache是包含应用程序变量的预定义对象)想法是从哈希值触发应用程序中的每个操作.在体面的浏览器中,哈希值更改会在历史记录中添加一个条目,在IE(<= 7)中则不会.在所有浏览器中,向后或向前导航到具有其他哈希值的页面不会触发页面刷新.这就是间隔函数接管的地方.每次检测到哈希值更改(通过编程方式,或通过单击后退或前进)时,应用程序都可以采取适当的操作.应用程序可以跟踪它自己的历史记录,我应该能够在应用程序中显示历史记录按钮(特别是对于IE用户).

据我所知,这可以跨浏览器工作,并且在内存或处理器资源方面没有任何成本.所以我的问题是:这是否是管理XHR-apps历史的可行解决方案?优缺点都有什么?

更新:因为我使用我的自制框架,我不想使用现有的框架之一.为了能够在IE中使用location.hash并将其包含在历史中,我创建了一个简单的脚本(是的,它需要一个iframe),这可能对你有用.我在我的网站上发布它,随意使用/修改/批评它.

javascript ajax xmlhttprequest browser-history

19
推荐指数
2
解决办法
5573
查看次数

真的没有办法在IE中公开html元素的原型(<8)吗?

我制作了一个模式来使用他们的原型创建和扩展html元素.这就像非浏览器中的魅力一样.示例代码可以在@jsbin找到(参见页面源代码)

这种模式的优点应该是速度(方法在元素原型链中,因此它们被引用一次).你猜对了:IE没有去.在IE <8中,html元素的原型是隐藏/不可访问的,因此对于您创建的每个元素,您必须再次引用非标准方法(如果您密集使用该模式,请留下很多指针).我在网上搜索了解决方案,但只找到了复杂的解决方法.有没有真的没有办法在IE浏览器访问HTML元素的原型?

javascript internet-explorer dom prototype-programming

7
推荐指数
1
解决办法
3765
查看次数

为什么在Firefox中innerHTML =""慢

我正在测试不同方法的速度,以动态地将HTML元素添加到DOM.我在这里建立了一个测试人员(代码是工作版,非常邋)).对于不同的浏览器,结果是(非常)不同的,Chrome获得速度的所有点,Opera是第二个 - 但这不是问题.

在Firefox中,我检测到清除div的问题(来自它的childNodes).当添加了大约50.000个div元素时,使用just来清除它需要很长时间

[div].innerHTML = "";
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?firefox是否为此实现了一些内在的垃圾收集方法?

javascript browser firefox dom

6
推荐指数
1
解决办法
3272
查看次数