变量提拔
所谓 变量提拔 即一切声明变量或声明函数都会被提拔到当前函数的顶部。
var a = 1;
function log(){
console.log(a);
var a = 2;
console.log(2);
}
log();
var a;
console.log(a);
人人能够猜想下上面打印到控制台的音讯会是什么?
效果分别是 : undefine,2 和 1
那末我们再看看下面这个代码打印出来会是什么呢?
var a = 1;
function log(){
console.log(a);
a = 2;
console.log(2);
}
log()
效果分别是 : 1 和 2
连系一下我们对变量提拔的定义,你或许已邃晓了。关于第一个Demo中,她终究实行的代码实际上是如许的
var a = 1;
function log(){
var a;
console.log(a);
a = 2;
console.log(2);
}
log()
所以终究打印出来的效果分别是 undefine 和 __2__,这就是变量提拔很简单,不是吗?然则你要保持警惕,由于他随时会让你吃大亏。
函数的声明体式格局
var getName = function(){
console.log('函数表达式');
}
function getName(){
console.log('函数声明');
}
getName();
照样请人人想一想会打印出什么?
宣布效果 : 函数表达式
这就是两种不一样的声明体式格局带来的效果,关于 函数声明 JS会在优先剖析,确保一切挪用这个要领的处所不会报错,然则关于 函数表达式 只会在JS从上往下剖析的时刻才会,正式剖析,我们能够看下面代码会打印出什么。
console.log(getName); // undefine
var getName = function(){
console.log('函数表达式');
}
console.log(getName); // 会打印出getName的要领
作用域
JS是没有块级作用域的(ES5之前),然则有函数作用域,我们看下面这两个Demo,看看二者的区分
function add(){
a += 10;
return a;
}
var a = 30;
console.log(add(a)+a);
function add(a){
a += 10;
return a;
}
var a = 30;
console.log(add(a)+a);
这是一道很基础的题目,当我们把两个Demo 同时写出来的时刻,我置信很多人是能够回答出准确答案的,下面宣布答案。
第一个Demo : 80
第二个Demo : 70
为何会获得如许的效果呢?我们看第一个Demo 函数内里的 a 实际上直接操纵window下面的,也就是全局环境。然则第二个Demo操纵的确切函数自身的形参,也就是自身的作用域,它的转变不会影响到全局环境的a
类
JS中声明类的要领有很多种,这里我就引见最典范的一种罢了
function Animal(){
this.name = "";
var food = "";
var eat = function(){
console.log('eat');
}
this.run = function(){
console.log('run');
}
}
Animal.prototype.name = "小明";
Animal.prototype.food = "穿山甲"
var animal = new Animal();
console.log(animal); // 会打印出什么属性?
console.log(animal.name); // 效果会是什么?
console.log(animal.food); // 那末这个呢?
起首这个触及到了闭包的观点,关于这个题目我在这里就不细致说了,给人人一个知乎链接,内里讲的答案异常的简单明了,记得要悉数看完,不要只关注高分项 JavaScript 里的闭包是什么?运用场景有哪些?,基础我要讲的都在这内里了。
至于 animal.name 为何会是 "" ,而 animal.food 是穿山甲,实在很简单,对象关于prototype会是低优先,先找自身存不存在name这个属性,找不到就到prototype去找。