JS中若干问题及解答
前言
本文涉及到的全部代码在Nodejs v6.9.5和Chrome v 61.0.3163.100中进行过验证
目录
- 前言
- 目录
- 作用域
- 变量提升
- 对象属性和变量
- 对象和函数
- 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
}
}
上面代码中出现了两个name
,var name
和 obj{name}
,其中前者name是变量名,后者是obj对象的属性名,前者可以通过变量名直接访问,而后者只是对象的一个属性名,必须通过对象访问。故上文中通过name直接访问到的是作为变量的var name
,而想访问 obj{name}
只能通过obj.name
。
对象和函数
JS里最初都是function
,object
也是从function
衍生出来的。{}
是Object,同时也是Function。
声明一个对象有几种方式
函数
函数也是变量。变量名是一个标记。是对变量操作的钥匙。指针,应用,句柄都可以表达类似的意思。函数名同时也是函数变量的变量名。函数名可以理解为一个指向函数实现的入口,对外代表整个函数。可以用var foo1 = function(){...}
,以及function foo2(){...}
,来定义foo函数,foo1和foo2指向相同的函数。(注意:这两种生成函数变量的操作不同,前者是赋值后者是声明,编译阶段对他们的处理不同)JS中的函数变量是高级函数advance function,可以进行变量的操作,比如赋值,组成数组,作为属性的值,作为函数的参数。