为什么javascript中如果没有function语句就不会执行else if语句?

问题描述 投票:0回答:2

当使用函数时,else if 部分被执行,但没有函数时,else if 语句不被执行,为什么? 这是将单词的第一个字符转换为大写的代码。

function showName() {
    var name = prompt("Type your name");

    if (name) {
        var nameParts = name.split(' ');

        for (var i = 0; i < nameParts.length; i++) {
            nameParts[i] = nameParts[i].charAt(0).toUpperCase() + nameParts[i].slice(1).toLowerCase();
        }

        var capitalName = nameParts.join(' ');

        alert("Hello, " + capitalName);

    }
    else if (name == null){
        alert("The prompt was Canceled.");
    }
    else {
        alert("The name has not typed.")
    }
}
showName();

当使用函数语句时,我的代码工作正常,但如果没有函数语句,当用户取消提示时,我期望相同的输出。 解释一下?

javascript node.js function if-statement prompt
2个回答
0
投票

要了解为什么删除

else if
语句后代码的
function
部分可能无法按预期执行,首先了解 JavaScript 代码执行的上下文和结构非常重要,特别是关于函数和作用域。

在 JavaScript 中,函数充当旨在执行特定任务的代码块。

function
关键字用于定义该块,定义函数时不执行函数内部的代码。它仅在函数被调用(called)时执行。这对于组织和控制代码执行流程至关重要。

在您提供的代码中,您有一个函数

showName
,它封装了提示用户输入姓名、处理该名称以及根据用户输入显示不同警报的逻辑。
if
else if
else
语句是此函数逻辑的一部分。

当您删除

function
语句及其相应的函数声明(即删除
function showName() {...}
并仅将代码保留在其中)时,您正在更改代码运行的上下文。以下是需要考虑的一些关键点:

  1. 全局作用域与局部作用域:在函数内部,变量和逻辑具有局部作用域。当您删除该函数时,所有代码都在全局范围内。此更改可能会影响变量和逻辑的交互方式,特别是当页面上有其他脚本或代码片段时。

  2. 执行时序:封装在函数中时,代码仅在函数被调用时运行(

    showName()
    )。如果没有该函数,代码会在脚本加载时立即运行。如果
    else if
    部分未按预期执行,可能是由于脚本运行时间与网页或应用程序的其余部分相关。

  3. 事件处理:如果您的目的是运行此代码来响应事件(例如单击按钮),则它需要位于事件发生时调用的函数内。如果没有该函数,代码会立即运行,不会等待任何用户交互。

  4. 代码隔离和可重用性:函数提供了一种隔离代码并使其可重用的方法。如果您的代码不在函数中,那么它是一次性执行,这可能不适合提示用户等任务。

关于您观察到的具体行为,如果

else if
else
部分未执行,则可能是由于上下文或执行时间的这些变化之一所致。当提示取消时,
name
应该是
null
,触发
else if
块。如果没有发生这种情况,可能是由于代码在函数外部执行的方式和时间所致。

要进一步诊断问题,请考虑以下事项:

  • 检查页面上是否有任何其他可能干扰的 JavaScript。
  • 确保脚本在适当的时间加载并执行(例如,在 DOM 完全加载后,如果它依赖于 DOM 元素)。
  • 使用
    console.log
    语句进行调试并查看代码中不同点处
    name
    的值。

最后,将代码保留在函数内是维护结构、可读性和功能的良好实践,尤其是在更复杂的应用程序中。


0
投票

使用全局

name
变量实际上设置了 window.name 属性。当您在提示上单击“取消”时,它会将
null
分配给
window.name
,但在分配之前会对其进行字符串化,因此您会得到
"null"
作为
name
的值。这就是为什么
if (name)
检查计算结果为 true。

在函数内部,

name
是一个局部变量,因此它可以正常工作,因为从
null
返回的
prompt
未字符串化。

© www.soinside.com 2019 - 2024. All rights reserved.