javascript中变量相关的若干问题

JS中若干问题及解答

前言

本文涉及到的全部代码在Nodejs v6.9.5和Chrome v 61.0.3163.100中进行过验证

目录

  1. 前言
  2. 目录
  3. 作用域
  4. 变量提升
  5. 对象属性和变量
  6. 对象和函数
  7. this的问题

作用域

语法作用域(或者说语法作用域)和动态作用域,JS基本上是语法作用域。语法作用域顾名思义是基于语法的。语法作用域在编译阶段就确定了变量的作用范围,而动态作用域是在执行的时候才能确定变量的值。语法作用域是基于代码中的作用域嵌套来一层层的确定变量的值的,和变量在代码中的定义位置有关。而动态作用域则是在程序的执行到变量的时候才去寻找变量的值,即是动态作用域中,变量的值与调用的函数相关,是基于程序的调用栈来确定的,(和JS中的this有些类似)。但JS基本上是语法作用域的(eval()和with除外)。

function foo(){
    console.log(a);
}
function bar(){
    var a = 3;
    foo();
}

var a = 2;
bar();
//此时如果是动态作用域输出 3
//而JS是语法作用域,所以输出 2

变量提升

重复定义

对象属性和变量

var name = "var" //var name 
var obj = {
    name:"obj_attr",//obj{name}
    get_name(){
        console.log(name); //var
        console.log(obj.name); //obj_attr
    } 
}

上面代码中出现了两个namevar nameobj{name},其中前者name是变量名,后者是obj对象的属性名,前者可以通过变量名直接访问,而后者只是对象的一个属性名,必须通过对象访问。故上文中通过name直接访问到的是作为变量的var name,而想访问 obj{name} 只能通过obj.name

对象和函数

JS里最初都是functionobject也是从function衍生出来的。{}是Object,同时也是Function。
声明一个对象有几种方式

函数

函数也是变量。变量名是一个标记。是对变量操作的钥匙。指针,应用,句柄都可以表达类似的意思。函数名同时也是函数变量的变量名。函数名可以理解为一个指向函数实现的入口,对外代表整个函数。可以用var foo1 = function(){...},以及function foo2(){...},来定义foo函数,foo1和foo2指向相同的函数。(注意:这两种生成函数变量的操作不同,前者是赋值后者是声明,编译阶段对他们的处理不同)JS中的函数变量是高级函数advance function,可以进行变量的操作,比如赋值,组成数组,作为属性的值,作为函数的参数。

猜你喜欢

转载自blog.csdn.net/lucifly/article/details/78439677