Code Monkey home page Code Monkey logo

Comments (9)

mqyqingfeng avatar mqyqingfeng commented on May 26, 2024 7

我也看了这个问题,确实是个很诡异的 bug。

问题的起源虽然是 IE8 下 typeof dom 节点会返回 'function',但是讨论着讨论着问题就变了。

有一个人写了这样的一个测试代码,这里贴上代码:

  function isFunction(value) {
    return typeof value == 'function';
  }

  var fnc = function() {};
  var obj = { 'a': 'b' };
  var num = 1;
  var xml = window.ActiveXObject ? new ActiveXObject('Msxml2.DOMDocument.3.0') : {};

  console.log('before JIT isFunction(fnc). Expected: true;  Got:', isFunction(fnc));
  console.log('before JIT isFunction(obj). Expected: false; Got:', isFunction(obj));
  console.log('before JIT isFunction(num). Expected: false; Got:', isFunction(num));
  console.log('before JIT isFunction(xml). Expected: false; Got:', isFunction(xml));

  var count = 200;
  while (count--) {
    isFunction(fnc);
  }
  console.log('typeof xml', typeof xml);

  console.log('after JIT isFunction(fnc). Expected: true;  Got:', isFunction(fnc));
  console.log('after JIT isFunction(obj). Expected: false; Got:', isFunction(obj));
  console.log('after JIT isFunction(num). Expected: false; Got:', isFunction(num));
  console.log('after JIT isFunction(xml). Expected: false; Got:', isFunction(xml));

在 IE11 下的 non-edge document modes 下,最后一个

after JIT isFunction(xml).   Expected: false; Got: true

这个人说是一个 IE11 下的 JIT bug,既然是编译上的 bug,解释的方式也无法按照常理理解了,为了让最后一个打印结果也变成 false, 只用在代码后面加上个|| false

后来这个人也验证了 IE11 下的 IE8 compat 模式的 DOM element 也有这个问题

var div = document.createElement('div');

// JIT the function
var count = 200;
while (count--) {
    _.isFunction(fn);
}

equal(_.isFunction(div), false);

如果不加上 || false 的话,这里的结果会是 true,加上的话,就会避免这个 JIT bug。

最后,没有验证过哈~ 我理解的是这样~

from underscore-analysis.

lessfish avatar lessfish commented on May 26, 2024

@a13821190779

是有历史原因的,具体可以参考以下几个链接

from underscore-analysis.

FoxDaxian avatar FoxDaxian commented on May 26, 2024

@hanzichi 看了你提供的连接,好像因为ie8和11下 typeof dom 节点 有时候会返回 'function'
但是如果返回'fcuntion'的话那么这个 || false 也就无用了啊?
我理解的对吗?

from underscore-analysis.

FoxDaxian avatar FoxDaxian commented on May 26, 2024

并且我开虚拟机测试了一下ie8,并没有重现这个问题啊,我的代码如下:

                var obj = {}

		var type = typeof obj

		console.log(type === 'function');
		console.log(type === 'object');

		console.log('----------');

		console.log((typeof obj) === 'function')
		console.log((typeof obj) === 'object')

from underscore-analysis.

sqfbeijing avatar sqfbeijing commented on May 26, 2024

同问。 @hanzichi 看了你提供的连接,好像因为ie8和11下 typeof dom 节点 有时候会返回 'function'
但是如果返回'fcuntion'的话那么这个 || false 也就无用了啊?
我理解的对吗?

from underscore-analysis.

sqfbeijing avatar sqfbeijing commented on May 26, 2024

为何加个 || false 就能改变结果= = 不明白

from underscore-analysis.

sqfbeijing avatar sqfbeijing commented on May 26, 2024

@mqyqingfeng 666 大神!

from underscore-analysis.

delayk avatar delayk commented on May 26, 2024

@mqyqingfeng 还是没看明白加不加 || false对于最后的结果为什么会有影响?
我看jashkenas/underscore#1621danschumann 描述typeof obj的结果保存到变量里的情况下是正确的,加 || false是隐式的实现了这一点吗?

from underscore-analysis.

mqyqingfeng avatar mqyqingfeng commented on May 26, 2024

@delayk 有人认为这是一个代码编译上的问题,加上 || false 是避免这个编译 bug,而不是通过执行这段代码从而获得正确的结果……不过提出这个问题的人也没有去验证他的这个 bug 是否可以通过这种方式解决……

from underscore-analysis.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.