自我评估Javascript

时间:2015-03-02 03:28:18

标签: javascript

请帮助我在javascript中理解这是如何工作的?

var myEvent = window.attachEvent || window.addEventListener;
var chkevent = window.attachEvent ? 'onbeforeunload' : 'beforeunload'; /// make IE7, IE8 compitable

    myEvent(chkevent, function(e) { // For >=IE7, Chrome, Firefox
        var confirmationMessage = 'Are you sure to leave the page?';  // a space
        (e || window.event).returnValue = confirmationMessage;
        return confirmationMessage;
    });

我理解脚本的其他部分但不了解(e || window.event).returnValue如何评估它?是否意味着如果e为真,则其属性returnValue将被设置,否则它将使用window.event

注意:请指导我这个问题的正确标题,因为我不知道如何调用这种javascript编码模式

4 个答案:

答案 0 :(得分:2)

我将在这里变得真实。此代码如此奇怪的最大原因是Internet Explorer和跨浏览器兼容性问题。

您引用的特定行使用JavaScript OR 运算符||,它基本上返回定义的第一个元素(或非假的)。因此,在这种情况下,如果浏览器将参数e传递给事件处理程序,那么将使用它,否则使用window.event

注意(e || window.event)中的括号。这告诉引擎在对结果做任何事情之前评估 OR 运算符。这是有道理的,因为如果定义了e.returnValue,您想要访问e,否则会window.event.returnValue

答案 1 :(得分:2)

这意味着:

e.returnValue = confirmationMessage;

如果不是e

window.event.returnValue.confirmationMessage;

考虑此代码段的输出:



var a = {}; 
var b = undefined;
var c = {}; 

(b || a).first = 'First!';
(c || a).second = 'Second!'; 

console.log(a); 
console.log(b);
console.log(c); 




Object { first: "First!" }   // <-- a
undefined                    // <-- b
Object { second: "Second!" } // <-- c

在行(b || a).first = 'First!';中,b评估falsy对a进行评估,是否真实,因此定义了a.first

(c || a).second = 'Second!';行中,c评估真实性,因此定义了c.second。请注意,a.second未定义,因为JavaScript&#39; s短路。

您发布的特定代码存在的原因是因为Internet Exploder&#s>资源管理器的旧版本。

答案 2 :(得分:2)

是的:)

如果e为“true”(非空,有效对象),那么它将返回e.returnValue,否则window.event.returnValue

答案 3 :(得分:0)

所有代码正在提供一个跨浏览器的解决方案来获取刚刚发生的事件。这是因为旧版本的IE不会将Event对象传递给事件处理程序,而是设置只能从事件处理程序访问的window.event。更确切地说:

首先检查是否设置了e。如果设置了,则括号中的代码返回e的值,然后获取e.returnValue的值。如果未设置e,则括号返回window.event,然后获取window.event.returnValue的值。

如果您想了解有关window.event对象的更多信息,可以在此处阅读。 Event Object IE