【问题标题】:Javascript - Function Being Executed Immediately when Stored as Variable?Javascript - 存储为变量时立即执行的函数?
【发布时间】:2015-09-25 07:03:33
【问题描述】:

第一次发帖。编程新手。

在 Javascript 中,当我声明一个新变量并将这个新声明的变量设置为存储一个函数时,该函数是否在代码运行时立即执行(执行上下文)?

例如,

function Person() {

    console.log(this);
    this.firstname = 'John';
    this.lastname = 'Doe';

}

var john = new Person();

变量 john 是否在同一行执行函数“Person”的同时被声明?

【问题讨论】:

  • 使用关键字new,您正在创建一个可以使用变量john 引用的新对象。删除new 并将调用Person 的结果存储在john 中。就如此容易。 W3schools 为初学者提供了很好的教程。
  • 变量声明在任何代码执行之前被处理,所以 john 在任何代码运行之前被创建并赋值为 undefined。同样,函数声明也在执行之前被处理,所以Person在执行开始之前也存在。当执行运行时,john 被赋值为右边表达式的返回值,它是 Person 的一个实例。
  • @Rinzler — 请展示 w3schools 解释如何创建执行上下文和建立环境记录的位置。我认为 OP 不会在那里学到这一点。
  • 为什么投反对票?这个问题可能看起来很幼稚,但它很清楚并且写得很好
  • @RobG 我说:Allah Akbar 有一个很好的初学者教程,我没说别的。

标签: javascript function variables execution


【解决方案1】:

您复制/粘贴的是对象创建。这意味着 john 是一个新的 Person 对象。 Person 是对象的类。 Person 函数中的 this 键与新创建的对象的实例相关。不要被function关键字滥用,这是一个令人困惑的(由于历史原因)JS关键字。 Person函数可以看作是一个对象构造函数。

EDIT : 去掉了题外话(题外话真的太多了)

【讨论】:

  • 补充一点:如果你看到new someFunction() () 表示它正在那个特定时刻执行,new 意味着它不使用return 值,而是创建该函数的新实例。
【解决方案2】:
var john = new Person();
  1. 变量john 已创建。
  2. RHS 被执行。

    2.1。 new 运算符调用Person 的构造函数。每个函数都隐含一个constructor()。这会导致创建对象。

  3. 返回 RHS 评估结果(在本例中为对象)。

  4. 结果被分配给 john,或者换句话说,现在 john(一个引用变量)将引用作为在 Person() 上执行的 new 运算符的结果而创建的对象。

【讨论】:

  • 这是一个 javascript 新手,RHS 是什么?
  • @StephanBijzitter RHS 是= 运算符的右侧表达式。
【解决方案3】:

如果你在函数后面加上()(optionalArgumentsHere)(有些函数带参数,有些不带参数),则表示它是一个函数调用,它将被执行。如果要将函数本身分配给变量,则需要省略()。这是可能的,因为函数是 JavaScript 中的对象(并非每种语言都如此)。

所以这里发生的情况是您声明了一个变量(实际上,由于提升,您更早地声明了它,正如 Pablo 所解释的),您执行 new Person() 并将结果分配给变量。

如果你调用了类似的函数

function fun() {
    return 5;
}

var x = fun();

您将把函数的返回值分配给变量。但是您的情况很特殊,因为您使用的是new。这意味着Person 是一个构造函数,它用于创建Person 类型的新对象。在该构造函数中,您使用 this 关键字将属性附加到新创建的对象。 new Person() 调用返回对象,即使 return 没有被显式调用。

【讨论】:

    【解决方案4】:

    在 Javascript 中,变量定义是“提升”的。意思是你贴的代码和后面的代码...

    var john;
    function Person() {
        console.log(this);
        this.firstname = 'John';
        this.lastname = 'Doe';
    }
    john = new Person();
    

    ... 是相同的,因为编译器会将变量声明提升到当前上下文的开头。所以,答案是否定的,先声明变量,然后将函数作为构造函数执行,然后将新创建的对象分配给该变量。

    您可以找到更多信息here

    【讨论】:

    • 这不是他问题的答案。
    • 问题是在构造函数执行时是否声明了变量。我的回答表明该变量是之前声明的。无论如何,我已经对其进行了编辑以使其更清晰
    猜你喜欢
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多