关于下面的代码,解释器如何知道该事件具有属性.keyCode。这段代码有效,我只是完全不明白为什么,而且更多的是这个记录。它是如何知道对象事件的类型。如果我称之为'e'或'e1'怎么办?方法原型f1(事件)在哪里记录?
function b0(event)
{if (event.keyCode==13)
{i4();
return false;}}
function o5('f4b_',b0);
o5(a,b){document.getElementById(a).onkeypress=b;}
其中元素id a是输入文本框。
答案 0 :(得分:2)
事件的名称是无关紧要的,在函数内部它只是另一个变量。您可以将其重命名为JellyMan,如果您将if (event.keyCode==13)
重命名为if (JellyMan.keyCode==13)
,它将正常工作。
事件类型由脚本在运行时确定。解释器不知道该事件具有.keyCode属性 - 如果您尝试调用它,并传入一个不正确类型的参数:b0('wheee, break it');
那么它将失败。
当作者编写脚本时,他认为函数b0将采用一个参数(他称之为事件)并且它将是一个eventHandler - 这在任何地方都没有指定,它只是假设没人会打电话给它别的。所有eventHandlers都有一个.keyCode属性,因此假设传入的对象有一个。
答案 1 :(得分:0)
口译员不必“知道”。当运行时系统调用事件处理程序时,它会向它传递一个具有或多或少记录良好的属性的对象。
如果您在传入奇怪事件对象的损坏的浏览器中运行该代码,则代码将失败。
答案 2 :(得分:0)
请记住,javascript是解释代码,而不是预编译代码。任何变量都可以包含任何类型。
因此,在函数b0
中,第二行代码:
if (event.keyCode==13)
告诉解释器获取传递给函数的第一个参数(名为event
)并从中获取名为keyCode
的属性。 Javascript将查看event参数,看看它是否是具有属性的正确变量类型,以及它是否实际上具有名为keyCode
的属性。如果是,它将获取它的值并将其与13进行比较。如果它不是具有任何属性的正确类型的变量,那么该行代码将失败并且javascript将引发异常。如果它是具有属性的正确类型的变量,但没有名为keyCode
的属性,那么它将继续使用undefined
的该属性的值,该值将使13的相等性测试失败。