【问题标题】:How Javascript know that a variable passed as parameter of function is an "event"Javascript 如何知道作为函数参数传递的变量是“事件”
【发布时间】:2020-12-11 09:37:16
【问题描述】:

javascript引擎通过它们的值知道变量的类型:

<script>
 var x=5.01; //x if float
 var x="abc"; //x is string
 var x=true; //x is Boolean
</script>

但在这里:

<script>
var loadFile = function(event) {
    var image = document.getElementById('output');
    image.src = URL.createObjectURL(event.target.files[0]);
}
</script>

我的问题是: 为什么event(作为函数参数传递)被称为事件对象而没有显式或隐式表达式来定义它? 是什么使它成为事件对象而不是其他类型,例如浮点整数..??

注意:这里调用fileLoad

&lt;input type=file id=profilepic accept="image/*" name=profilepic onchange="loadFile(event)"&gt;

【问题讨论】:

    标签: javascript syntax dom-events


    【解决方案1】:

    是什么使它成为事件对象,而不是像浮点整数这样的其他类型..??

    什么都没有。你没有理由不写:

    loadFile(42);
    

    在这种情况下,该调用中的event 将是号码42,而不是事件。

    在调用loadFile 期间使event 成为事件对象的唯一因素是调用它的代码。例如,如果它作为事件处理程序连接到 DOM 元素,则浏览器中的 DOM 事件处理代码会以事件对象作为第一个参数来调用该处理程序。

    如果您想在代码中强制执行类型安全,则需要除 JavaScript 之外的其他东西,例如 TypeScript(编译为 JavaScript)、Flow、JSDoc+IDE 支持等。这些都在 JavaScript 之上添加了一个静态类型系统这可以帮助您捕获函数期望(例如)事件对象但您使用数字调用它的错误。

    【讨论】:

    • 如果我理解得很好..在这里调用loadFile 会使event 被称为事件对象:&lt;input type=file id=profilepic accept="image/*" name=profilepic onchange="loadFile(event)"&gt;
    • @FReader04 - 是的,尽管我敦促您不要使用onxyz-attribute-style 事件处理程序;我建议改用 addEventListener 或使用像 React 或 Vue 这样的 MVC-ish 库。但是是的,在该示例中,对loadFile 的调用在浏览器生成的范围内执行,该范围内的标识符称为event,该标识符引用该更改事件的事件对象,因此loadFile(event) 调用@987654334 @ 并将该对象传递给函数。
    【解决方案2】:

    函数参数的值是在函数被调用时确定的。

    当某物调用该函数时,它可能会也可能不会传递事件对象。

    如果是这样。伟大的。如果没有,那么您将收到异常,因为它将无法从参数中读取event.target

    参数名称event只是一个变量名。它不强制执行类型安全。

    var loadFile = function(event) {
      var image = document.getElementById('output');
      image.src = URL.createObjectURL(event.target.files[0]);
    }
    
    loadFile(2020);

    【讨论】:

    • 我明白了!我添加了其他代码。请查看我的问题。
    • @FReader04 — 所以你正在读取全局 event 变量并传递它。
    【解决方案3】:

    我认为这是因为 JavaScript 是弱类型。它只是检查参数是否具有运行函数所必需的属性,并且它会尽其最大能力这样做,而且通常你最终会遇到错误而不是错误。所以改用 TypeScript 吧。

    【讨论】:

    • TypeSript...但是为什么没有 javascript 这么出名呢...直到你提到它我才听说它。
    【解决方案4】:

    Javascript 不强制执行任何类型。 ,程序员,知道你的函数将得到什么类型。您始终可以使用typeof 检查您的参数的类型,以确保它符合您的预期。

    【讨论】:

    • 知道了!!我添加了其他代码..请查看我的问题
    猜你喜欢
    • 2013-09-03
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    相关资源
    最近更新 更多