精华内容
下载资源
问答
  • 解析器向执行环境加载数据时,对函数声明函数表达式并非一视同仁。解析器会率先读取函数声明,并使其执行任何代码之前可用(可以访问)。至于函数表达式,则必须等到解析器执行到它所在代码行,才会真正被...
    4119193e44baca7f63c1fb9bcf4e983d.png

    解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁。解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问)。至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。如下:

    console.log(sum(10,10));//20function sum(num1, num2){return num1 + num2;}

    以上代码完全可以正常运行。因为在代码开始执行之前,解析器就已经通过一个名为函数声明提升的过程,读取并将函数声明添加到执行环境中。所以,即使声明函数的代码在调用它的代码后面,JavaScript引擎也能把函数声明提升到顶部。

    如果把上面的函数声明改为等价的函数表达式,就会在执行期间导致错误。如下:

    console.log(sum(10,10));//TypeError: sum is not a functionvar sum = function(num1, num2){return num1 + num2;}

    除了什么时候可以通过变量访问函数这一点区别之外,函数声明与函数表达式的语法其实是等价的。

    展开全文
  • 块级作用域的变量声明函数声明最近一个讨论群看到一个面试题:{ a = 10; function a(){}; console.log(a)//10 }; console.log(a);//10 what?不应该是:function a(){} 、function a(){} 吗?最后一位牛人给...

    块级作用域的变量声明和函数声明

    最近在一个讨论群看到一个面试题:

    {
      a = 10;
      function a(){};
      console.log(a)//10
    };
    console.log(a);//10
    

    what?不应该是:function a(){} 、function a(){} 吗?

    最后一位牛人给出了他的理解,这里本人只是作出验证,加深理解。

    环境默认都是chrome环境,支持ES6。
    下文提出的默认变量指的是没有使用 var、let、const定义的变量。

    块级作用域的默认变量

    我们先看这样一个 :

    console.log(a);//ReferenceError: a is not defined
    {
        a = 10;
        console.log(a)//10
    }
    console.log(a);//10
    

    可能有些人会像我一样感到诧异:为什么第一个a打印出来的不是undefined?a = 10默认不是 var a = 10吗?应该会提升到全局作用域的顶端的啊。

    那好,让我们把window.a打印出来看看:

    console.log(window.a);//undefined
    {
      console.log(window.a,a);//undefined  、a is not defined
        a = 10;
        console.log(window.a,a)//10 10
    }
    console.log(window.a,a);//10 10
    

    结论:我们可以清晰的看到,在块级作用域中默认声明的变量,只有执行了声明代码,变量才会被挂载到全局作用域上。

    让我们在看看使用var声明的变量的情况:

    console.log(window.a,a);//undefined  undefined
    {
      console.log(window.a,a);//undefined  、undefined
        var a = 10;
        console.log(window.a,a)//10 10
    }
    console.log(window.a,a);//10 10
    

    结论:对比上一个例子,我们可以得出,使用var声明的变量会在编译阶段被提升到全局作用域上,不过它只是将声明提升,赋值操作并未提升上去。

    小结

    • 在块级作用域中默认声明的变量,只有代码执行到声明语句之后,才可以进行访问,否则会报错。
    • 块级作用域中默认声明的变量会被提升到全局作用域。

    块级作用域的函数声明

    在块级作用域中的函数声明和变量是不同的。不多说,直接撸代码:

    console.log(a);//undefined
    {
        function a(){}
    }
    

    回到第一个例子,如果块级作用域里面是一个默认变量,则第一行代码会直接报错,而函数声明则会打印undefined

    其实在阮一峰老师的ECMAScript6入门中关于这一点就做了明确说明:

    c497aa0347d16bdcae86ca266672f516.png

    块级作用域函数,就像预先在全局作用域中使用var声明了一个变量,且默认值为undefined

    console.log(window.a,a);//undefined undefined
    {
      console.log(window.a,a);//undefined function a(){}
      function a(){};
      console.log(window.a,a)//function a(){} function a(){}
    }
    console.log(window.a,a);//function a(){} function a(){}
    

    在这个例子中,第一行输出大概是比较符合预期的。至于第二行window.a=undefoned,而a=function a(){} ,上面在阮一峰老师的文章中说过,声明函数a会被提升到全局作用域,且在其块级作用域中,也会被提升到顶层。而window.a为什么会为undefined呢?因为只有window.a只有等块级作用域中函数声明的定义的那行代码执行过之后,才会被映射到全局作用域。

    小结

    • 块级作用域函数在编译阶段将函数声明提升到全局作用域,并且会在全局声明一个变量,值为undefined。同时,也会被提升到对应的块级作用域顶层。
    • 块级作用域函数只有定义声明函数的那行代码执行过后,才会被映射到全局作用域。

    块级作用域中有同名的变量和函数声明

    看 :

    console.log(window.a,a);//undefined undefined
    {
        console.log(window.a,a);//undefined function a(){}
        function a() {};
        a = 10;
        console.log(window.a,a); //function a(){}  10
    };
    console.log(window.a,a); //function a(){}  function a(){}
    

    在这里,首先,块级作用域函数a的声明会被提升到全局作用域,第一行打印比较符合预期。然后在块级作用域中,由于声明函数a提升到块级作用域顶端,所以打印a = function a(){},而window.a由于并没有执行函数定义的那一行代码,所以仍然为undefined。当执行到声明函数定义的时候,就会把函数a映射到全局作用域中。当执行a = 10的时候,JS引擎会进行LHS查找,此时,声明函数已经被同时提升到全局作用域和块级作用域顶端了,由于遮蔽效果,此时查找a只会找到块级作用域内的a,并不会找到全局作用域的a,这时,a已经被定义,a = 10只会执行赋值操作,并不会进行提升。

    我们再来看 2。它会更加抽象,准备好了没?

    console.log(window.a,a);//undefined undefined
    {
        console.log(window.a,a);//undefined function a(){}
        a = 10;
        function a() {};
        console.log(window.a,a); //10  10
    };
    console.log(window.a,a); //10 10
    

    有了上面例子的铺垫,相信大家对前两行的打印结果不会有任何疑问了吧?

    那好,我们直接进行下一步,执行a = 10,我们知道,此时,在块级作用域中函数声明已经被提升到顶层,那么此时执行a,就是相当于赋值,将函数声明a赋值为数字a,可以理解吗?如果有疑问,可以看 1。然后,执行到函数声明语句,此时,虽然这一行代码是函数声明语句,但是a,已经为数字10了,所以,执行function a(){}之后,a的值10就会被赋值给全局作用域上的a,所以下面打印的window.a,a都为10!!!

    小结

    • 块级作用域函数只有执行函数声明语句的时候,才会重写对应的全局作用域上的同名变量。
    展开全文
  • 类/静态变量属于类,就像实例变量一样,它们是类内在任何方法之外声明的,但是使用...如果您中声明静态变量,则尚未初始化它,就像使用实例变量一样,编译器将使用默认构造函数中的默认值对其进行初始化...

    类/静态变量属于类,就像实例变量一样,它们是在类内在任何方法之外声明的,但是使用static关键字声明。

    它们可以在编译时访问,您可以在实例化之前/不实例化类时进行访问,整个类中只有一个静态字段的副本可用,即,静态字段的值在所有对象中都相同。您可以使用static关键字定义一个静态字段。

    如果您在类中声明了静态变量,则尚未初始化它,就像使用实例变量一样,编译器将使用默认构造函数中的默认值对其进行初始化。

    是的,您还可以使用构造函数初始化这些值。

    示例public class DefaultExample {

    static String name;

    static int age;

    DefaultExample() {

    name = "Krishna";

    age = 25;

    }

    public static void main(String args[]) {

    new DefaultExample();

    System.out.println(DefaultExample.name); System.out.println(DefaultExample.age);

    }

    }

    输出结果Krishna

    25

    声明最终和静态

    但是,如果您声明实例变量static,而final Java编译器将不会在默认构造函数中对其进行初始化,则必须初始化static和final变量。如果您不编译,则会生成错误。

    示例public class DefaultExample {

    static final String name;

    static final int age;

    public static void main(String args[]) {

    new DefaultExample();

    System.out.println(DefaultExample.name); System.out.println(DefaultExample.age);

    }

    }

    编译时错误DefaultExample.java:2: error: variable name not initialized in the default constructor

    static final String name;

    ^

    DefaultExample.java:3: error: variable age not initialized in the default constructor

    static final int age;

    ^

    2 errors

    但是,如果您尝试初始化声明为final和static的变量,则编译器会将其视为尝试初始化变量,并且会生成编译时错误。

    示例public class DefaultExample {

    static final String name;

    static final int age;

    DefaultExample() {

    name = "Krishna";

    age = 25;

    }

    public static void main(String args[]) {

    new DefaultExample();

    System.out.println(DefaultExample.name);

    System.out.println(DefaultExample.age);

    }

    }

    编译时错误OutputDeviceAssignedDefaultExample.java:5: error: cannot assign a value to final variable name

    name = "Krishna";

    ^

    DefaultExample.java:6: error: cannot assign a value to final variable age

    age = 25;

    ^

    2 errors

    展开全文
  • 相当于在函数中声明的静态变量等于全局变量。 后来发现这个理解有点不全面了。 最近学习C++.对这个静态变量有了更深的理解,在这里做一些补充。 首先,C++中就是无非多了一个类的感念。其实类是非常容易理解的。...
    以前对静态变量只是在C里面的理解。
    
    我是这样认为的,静态变量可以在函数中声明,然后其他函数中也可以使用。相当于在函数中声明的静态变量等于全局变量。
    
    后来发现这个理解有点不全面了。
    
    最近学习C++.对这个静态变量有了更深的理解,在这里做一些补充。
    
    首先,C++中就是无非多了一个类的感念。其实类是非常容易理解的。就可以比喻成一个变量,前面多加了一个修饰符。所以不同类中的变量名字可以一样。但是在整个程序中他们的含义是不同的。因为相同的变量有不同的修饰。因此,实际上他们对于整个程序而言就是不同的变量。
    
    但是C++中变量都是有类的限制的,一般我们的变量也都是在类里面声明。但是如果定义了静态变量,就必须在类外定义。因为,静态类是最新被初始化,必须先赋值(记住)。
    
    如果定义了静态变量之后,在该类定义下的其他变量,都是能同时共享该静态变量。非静态变量都是独立互补干涉的。
    
    这样就可以使用不同的类的对象,对该类的同一个变量做修改。相当于该类的这个静态变量是类所以对象公共的变量。
    


    展开全文
  • 静态成员变量在仅仅是声明,没有定义,所以要类的外面定义,实际上是给静态成员变量分配内存。通过类名,对象,成员函数都可以访问静态成员变量。 类的静态成员变量需要类外分配内存空间。 静态成员函数只能...
  • C++ 不允许返回一个完整数组作为...另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为static变量。例如: #include <iostream> using namespace std; int a[10] = { 10,20 }; char *GetCha..
  • C++中的静态变量,静态函数 静态变量:1.对象均可以访问;2.需要外部声明;3.与对象独立 http://c.biancheng.net/view/2227.html 静态函数:1.只能访问静态成员;2.需要外部声明;3.与对象独立 4.无this指针 ...
  • Java中的静态变量和静态函数

    千次阅读 2015-03-11 15:50:23
    Java中的静态变量和静态函数(方法)和C++也类似。有几点需要重新复习一下: 1)如果想让一个类的所有对象共享数据,可以使用静态变量;如果想共享函数,可以使用静态函数。 2)如果某个对象修改了静态变量...
  • 同源文件的函数中使用使用全局变量,需要将全局变量提前声明;同时不包含全局变量定义不同源文件需要用extern关键字再次声明。关于C语言全局变量和局部变量,还有几个注意点:如果该函数内定义了一个与之前...
  • C++中的静态变量成员与静态成员函数 声明为static的类成员(成员数据或成员函数)称为类的静态成员特性 : 静态成员为所有的类对象所共享,不属于某个具体的事例 静态成员即可用类名::静态成员或者对象....
  • 函数 static 变量的生命周期程序流第一次[0]遇到声明时开始,并程序终止时结束 . 这意味着运行时必须执行一些簿记,以便仅实际构建时才销毁它 .另外,由于标准说静态对象析构函数必须按照完成构造相反顺序...
  • 全局变量:其是所有的函数体的外部定义的,程序的所有部分(甚至是其他文件的代码都可以使用,存储程序部分的静态存储区,也就是作用域为整个程序的结束),但是如果另外一个文件使用extern关键字声明另外一...
  • 类中的静态成员变量函数类定义时就有了它自己的内存区域。 1:静态成员函数不能调用非静态成员变量函数。 2:类中声明了静态成员变量,使用前必须初始化,否则没有分配内存区域,不能使用。 3:所有类...
  • Java的静态变量和静态函数静态变量:JAVA在声明的时候,其实并没有申请和产生内存空间,就如同我们的一个切实可行的想法,但其实并没有去实施这个想法。而类只有用这种数据类型创建一个类的对象的时候,才能...
  • 1 类中的静态变量不能通过构造函数参数列表来初始化,因为静态变量不属于哪个对象。同时静态变量不初始化的情况下系统会自动为变量赋值,数值型赋值为零,字符型赋值为空。 非静态变量只有定义时才会被分配内存...
  • 不仅在函数中声明的变量是局部变量,为声明函数设置的参数因为只能在在本函数内部使用所以也是局部变量。它们的作用域仅限于函数内部,因为当每次函数被调用时,内部的变量才被声明,执行完毕后内部的变量都被释放。...
  • 答:这道程序题存在着成员变量问题,常量必须构造函数初始化列表里面初始化或者将其设置为static。结构如下: class A { static const int size=0;//(属于类内初始化) } 或者 class A { A() {con...
  • 中的静态成员变量、静态成员函数? (1)类中的静态成员变量: 静态成员变量属于整个类,不属于某个特定的对象,因此无论创建了多少个对象,所有对象都共享类中的静态成员变量。静态成员变量必须类内声明,类...
  • 本文主要介绍C++回调函数中调用类中静态成员变量或非静态成员函数 回调函数中调用类中静态成员变量或非静态成员函数 【问题】如何类中封装回调函数? a.回调函数只能是全局或是静态的。 b.全局函数会...
  • 在PHP函数中,可以声明变量为静态变量,大多人估计可能不知道,普通变量在函数调用结束时,就销毁了,但是静态变量在函数被调用结束时,不会被销毁,而是下次在调用该函数,时 ,还能保留上次调用函数时值,用...
  • 回调函数中调用类中的非静态成员变量或非静态成员函数 【问题】如何类中封装回调函数?a.回调函数只能是全局的或是静态的。b.全局函数会破坏类的封装性,故不予采用。c.静态函数只能访问类的静态成员,不能访问...
  • C++,类的静态成员变量是类所有,所有的函数都可以访问,只不过对于全局变量,要注意它的声明和定义。类里面是声明,但是还得外面定义。 如: a.h: class A { public:  static int get_num(); ...
  • 2. 因为不属于类,类实例化之前就已经存在,所以静态成员函数是不能调用普通成员函数和成员变量的。 3. 静态成员函数没有this指针,因而不能用const声明。 不属于对象、没有this指针,那怎么静态成员函数怎么...
  • C#静态函数静态变量

    千次阅读 2018-08-21 15:30:04
    C# 类的静态成员 我们可以使用 static 关键字把类成员定义为静态的。当我们声明一个类成员为静态时,意味着无论有...静态变量成员函数或类的定义外部进行初始化。你也可以类的定义内部初始化静态变量。 下面...
  • 1、静态变量(persistent)在函数中声明的变量,当函数调用完之后就会释放。如果想保留这个变量的值(供该函数下一次调用),可以把这个变量声明为静态变量静态变量不能在声明的时候赋值,而且只能在function里声明,且...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,642
精华内容 1,456
关键字:

在函数中声明的静态变量