1. 变量声明提升和函数声明提升(重点规则)
1. 从概念的字面意义上说,“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。
2. 实际上变量和函数声明在代码里的位置是不会动的,而是在编译阶段被放入内存中。
3.JS 在执行任何代码段之前,将函数声明放入内存中的优点之一是,你可以在声明一个函数之前使用该函数,
4. 变量提升也适用于其他数据类型和变量。变量可以在声明之前进行初始化和使用。但是如果没有初始化,就不能使用它们。
5. 函数和变量相比,会被优先提升。这意味着函数会被提升到更靠前的位置,函数提升时,参数也会也会提前(变量值和对象在堆中的内存地址值)。
6. 函数表达式不会被提升:
notHoisted();
var notHoisted = function() {
console.log('bar');
};
function test(x) {
console.log(x)
console.log('x')
}
const p = 1
const p2 = test(p)
console.log(p)
console.log('p')
console.log(p2)
7. 函数提升优先级高于变量提升,且不会被同名变量声明覆盖,但是会被变量赋值后覆盖。而且存在同名函数与同名变量时,优先执行函数。同名函数会被覆盖。
console.log(a);
console.log(a());
var a=1;
function a(){
console.log(1);
} console.log(a);
a=3
console.log(a())
8. window全局作用域和fn函数作用域,在打印变量时,会先在fn函数作用域里面查找,因为在执行fn函数时,在函数内部也会先进行变量提升.
9. 同一作用域下存在多个同名函数声明,后面的会替换前面的函数声明
2. 变量声明和赋值
console.log(num);
var num;
num = 6;
3. 函数声明和调用
function catName(name) {
console.log("我的猫名叫 " + name);
}
catName("Tigger");
4. 变量提升和函数提升笔试题
1.说出下面运行的结果,解释原因。
例1:
function test(person) {
person.age = 26
person = {
name: 'hzj',
age: 18
}
return person
}
const p1 = {
name: 'fyq',
age: 19
}
const p2 = test(p1)
console.log(p1)
console.log(p2)
结果:
p1:{name: “fyq”, age: 26}
p2:{name: “hzj”, age: 18}
原因:
2. 说出下面运行的结果,解释原因
function test(x) {
console.log(x)
console.log('x')
}
const p1 = 1
const p2 = test(p1)
console.log(p1)
console.log('p1')
console.log(p2)
结果:
1
x
1
p
undefined
原因:
3. 说出下面运行的结果,解释原因
1、第一题
var a = 4
function fn () {
console.log(a)
var a = 5
}
fn()
输出结果:undefined
var a = 4
function fn () {
var a;
console.log(a);
a = 5
}
fn()
2、第二题
function a() {}
var a;
console.log(typeof a)
输出结果:function
function a() {}
var a = 1;
console.log(typeof a)
输出结果:number
3、第三题
console.log(typeof a)
function a() {}
var a = 1;
输出结果:function
4、第四题
console.log(v1);
var v1 = 100;
function foo() {
console.log(v1);
var v1 = 200;
console.log(v1);
}
foo();
console.log(v1);
输出结果:
undefined
undefined
200
100
5、第五题
console.log (foo);
var foo = function () {
console.log('foo1');
}
foo();
var foo = function () {
console.log('foo2');
}
foo();
ƒ () {
console.log('foo2');
}
foo1
foo2
foo;
var foo = function () {
console.log('foo1');
}
foo();
var foo = function () {
console.log('foo2');
}
foo();
foo1
foo2
foo();
function foo() {
console.log('foo1');
}
foo();
function foo() {
console.log('foo2');
}
foo();
foo2
foo2
foo2
foo();
var foo = function() {
console.log('foo1');
}
foo();
function foo() {
console.log('foo2');
}
foo();
foo2
foo1
foo1