Javascript 为什么我不能将undefined指定给window.load?

Javascript 为什么我不能将undefined指定给window.load?,javascript,undefined,Javascript,Undefined,我刚注意到这种奇怪的效果 window.onload = undefined; console.log(window.onload); // print 'null', instead of 'undefined' 虽然它对其他对象(包括内置对象)起到预期的作用,但对象(例如 Array.prototype.slice = undefined; console.log(Array.prototype.slice); // print 'undefined' 为什么会这样?这种行为是这样的,因

我刚注意到这种奇怪的效果

window.onload = undefined;
console.log(window.onload); // print 'null', instead of 'undefined'
虽然它对其他对象(包括内置对象)起到预期的作用,但对象(例如

Array.prototype.slice = undefined;
console.log(Array.prototype.slice); // print 'undefined'

为什么会这样?

这种行为是这样的,因为.onload是一个setter,它的工作原理如下:

window = {
    // Other window properties and methods

    get onload() {
        // returns null if no function was added or returns the last function added
    },

    set onload(value) {
        if (typeof value === 'function') {
            loadListener = value; // loadListener is the function called when load event is triggered
        }
    }

    // Other window properties and methods
}

此行为是这样的,因为.onload是一个setter,其工作原理如下:

window = {
    // Other window properties and methods

    get onload() {
        // returns null if no function was added or returns the last function added
    },

    set onload(value) {
        if (typeof value === 'function') {
            loadListener = value; // loadListener is the function called when load event is triggered
        }
    }

    // Other window properties and methods
}


为什么要将undefined分配给window.load?没有实际原因,我正在查看另一个SO问题,在尝试回答时,我注意到此行为并没有如我预期的那样工作。您在哪个浏览器中测试?也许它在多个浏览器中有所不同。你可能会在本文中得到一些提示:我相信它接近或解决了一些类似的问题@TJHeuvel Chrome和Firefox都给了我相同的结果您为什么要为window.load分配undefined?没有实际原因,我正在看另一个SO问题,在试图回答时,我注意到这个行为并没有像我预期的那样工作。您在哪个浏览器中测试?也许它在多个浏览器中有所不同。你可能会在本文中得到一些提示:我相信它接近或解决了一些类似的问题@TJHeuvel Chrome和Firefox都给了我相同的结果。这确实解释了这一现象,但你怎么知道?这是事件驱动架构的逻辑,你可以使用多个。onload函数分配,所有这些都可以工作,请在维基百科或我的博客上阅读更多内容:,在我基于nodejs的eventEmitter类创建自己的事件发射器的地方,它与此不同。OneEvent语法,但它的工作方式是相同的。如果您不自己处理该逻辑,或者如果您不使用为您处理该逻辑的库,则无法使用多个onload函数。是的,您是对的,我很久没有使用过.OneEvent语法了,我总是使用.addEventListener方法,这就是为什么我混淆了它的功能,谢谢。我认为getter和setter是相对较新的东西,如果没有它们,window对象就无法实现,除非它不是在JS中实现的。我猜他们对代码进行了改进,并假设在典型的onload用例中它是向后兼容的。顺便说一句,你知道有什么地方可以让我看一下内置对象(如window)的源代码吗?我试图搜索Chromium,但在那里找不到内置JS对象的代码。这确实解释了这种现象,但你怎么知道?这是事件驱动架构的逻辑,你可以使用多个。onload函数分配,所有这些都可以工作,请在wikipedia:或我的博客上阅读更多内容:,在我基于nodejs的eventEmitter类创建自己的事件发射器的地方,它与此不同。OneEvent语法,但它的工作方式是相同的。如果您不自己处理该逻辑,或者如果您不使用为您处理该逻辑的库,则无法使用多个onload函数。是的,您是对的,我很久没有使用过.OneEvent语法了,我总是使用.addEventListener方法,这就是为什么我混淆了它的功能,谢谢。我认为getter和setter是相对较新的东西,如果没有它们,window对象就无法实现,除非它不是在JS中实现的。我猜他们对代码进行了改进,并假设在典型的onload用例中它是向后兼容的。顺便说一句,你知道有什么地方可以让我看一下内置对象(如window)的源代码吗?我试图搜索Chromium,但在那里找不到内置JS对象的代码。