var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function(fn) {
fn();
arguments[0]();
}
};
obj.method(fn, 1);
10
2
10. 代码输出结果
var a = 1;
function printA(){
console.log(this.a);
}
var obj={
a:2,
foo:printA,
bar:function(){
printA();
}
}
obj.foo();
obj.bar();
var foo = obj.foo;
foo(); // 1
2
1
1
11. 代码输出结果
var x = 3;
var y = 4;
var obj = {
x: 1,
y: 6,
getX: function() {
var x = 5;
return function() {
return this.x;
}();
},
getY: function() {
var y = 7;
return this.y;
}
}
console.log(obj.getX()) // 3
console.log(obj.getY()) // 6
3
6
12. 代码输出结果
var a = 10;
var obt = {
a: 20,
fn: function(){
var a = 30;
console.log(this.a)
}
}
obt.fn(); // 20
obt.fn.call(); // 10
(obt.fn)(); // 20
20
10
20
13. 代码输出结果
function a(xx){
this.x = xx;
return this
};
var x = a(5);
y = null
console.log(x.x)
console.log(y.x)
undefined
6
14. 代码输出结果
function foo(something){
this.a = something
}
var obj1 = {
foo: foo
}
var obj2 = {}
obj1.foo(2);
console.log(obj1.a);
obj1.foo.call(obj2, 3);
console.log(obj2.a);
var bar = new obj1.foo(4)
console.log(obj1.a);
console.log(bar.a);
2
3
2
4
15. 代码输出结果
function foo(something){
this.a = something
}
var obj1 = {}
var bar = foo.bind(obj1);
bar(2);
console.log(obj1.a);
var baz = new bar(3);
console.log(obj1.a);
console.log(baz.a);
2
2
3
三、作用域&变量提升&闭包
1. 代码输出结果
(function(){
var x = y = 1;
})();
var z;
console.log(y); // 1
console.log(z); // undefined
console.log(x); // Uncaught ReferenceError: x is not defined
//
2
var a, b
(function () {
console.log(a);
console.log(b);
var a = (b = 3);
console.log(a);
console.log(b);
})()
console.log(a);
console.log(b);
undefined
undefined
3
3
undefined
3
3
var friendName = 'World';
(function() {
if (typeof friendName === 'undefined') {
var friendName = 'Jack';
console.log('Goodbye ' + friendName);
} else {
console.log('Hello ' + friendName);
}
})();
Goodbye Jack
4
var fn2
function fn1(){
console.log('fn1')
}
fn2 = function() {
console.log('fn2')
}
fn1()
fn2()
fn2()
fn1
Uncaught TypeError
fn2
5. 代码输出结果
function a() {
var temp = 10;
function b() {
console.log(temp); // 10
}
b();
}
function a() {
var temp = 10;
b();
}
function b() {
console.log(temp); // 报错 Uncaught ReferenceError: temp is not defined
}
a();
a();
6. 代码输出结果
var a=3;
function c(){
alert(a);
}
(function(){
var a=4;
c();
})();
3
7
function fun(n, o) {
console.log(o)
return {
fun: function(m){
return fun(m, n);
}
};
}
var a = fun(0); a.fun(1); a.fun(2); a.fun(3);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1); c.fun(2); c.fun(3);
undefined 0 0 0
undefined 0 1 2
undefined 0 1 1
8
f = function() {return true;};
g = function() {return false;};
(function() {
if (g() && [] == ![]) {
f = function f() {return false;};
function g() {return true;} //在匿名函数内部发生函数提升 因此if判断中的g()返回true
}
})();
console.log(f());
首先这里定义了两个变量f和g,我们知道变量是可以重新赋值的。后面是一个匿名自执行函数,在if条件中调用函数g(0), 由于在匿名函数中,又重新定义了函数g,就覆盖了外部定义的变量g。所以这里调用的是内部函数g方法,返回true。第一个条件通过,进入第二条件。
第二个条件是[] != [],在js中,当用于布尔运算时,比如在这里,对象的非空引用被视为true,空引用null则被视为false。由于这里不是一个null,而是一个没有元素的数组,所以[]被视为true,而![]的结果就是false。当一个布尔值参与到条件运算的时候,true会被看作1,而false会被看作0。现在条件变成了[] == 0的问题了,当一个对象参与条件比较的时候,它会被求值,求值的结果是数组会变成一个字符串,[]的结果就是“”,会被当做0,所以,条件成立
两个条件都成立,所以会执行条件中的代码,f在定义是没有使用var,所以他是一个全局变量。因此,这里会通过闭包访问到外部的变量f,重新赋值。现在执行f函数返回值已经成为false了。而g则不会有这个问题,这里是一个函数内部定义的g,不会影响到外部的g函数,所以最后的结果就是false
四、原型&继承
1
function Person(name) {
this.name = name
}
var p2 = new Person('king');
console.log(p2.__proto__) //Person.prototype
console.log(p2.__proto__.__proto__) //Object.prototype
console.log(p2.__proto__.__proto__.__proto__) // null
console.log(p2.__proto__.__proto__.__proto__.__proto__)//null后面没有了,报错
console.log(p2.__proto__.__proto__.__proto__.__proto__.__proto__)//null后面没有了,报错
console.log(p2.constructor)//Person
console.log(p2.prototype)//undefined p2是实例,没有prototype属性
console.log(Person.constructor)//Function 一个空函数
console.log(Person.prototype)//打印出Person.prototype这个对象里所有的方法和属性
console.log(Person.prototype.constructor)//Person
console.log(Person.prototype.__proto__)// Object.prototype
console.log(Person.__proto__) //Function.prototype
console.log(Function.prototype.__proto__)//Object.prototype
console.log(Function.__proto__)//Function.prototype
console.log(Object.__proto__)//Function.prototype
console.log(Object.prototype.__proto__)//null
2
// a
function Foo () {
getName = function () {
console.log(1);
}
return this;
}
// e
function getName () {
console.log(5);
}
// b
Foo.getName = function () {
console.log(2);
}
// c
Foo.prototype.getName = function () {
console.log(3);
}
// d
var getName = function () {
console.log(4);
}
Foo.getName(); // 2
getName(); // 4
Foo().getName(); // 1
getName(); // 1
new Foo.getName(); // 2
new Foo().getName(); // 3
new new Foo().getName(); // 3
3
var F = function() {};
Object.prototype.a = function() {
console.log('a');
};
Function.prototype.b = function() {
console.log('b');
}
var f = new F();
f.a();
f.b();
F.a();
F.b()
a
Error
a
b
function Dog() {
this.name = 'puppy'
}
Dog.prototype.bark = () => {
console.log('woof!woof!')
}
const dog = new Dog()
console.log(Dog.prototype.constructor === Dog && dog.constructor === Dog && dog instanceof Dog)
true
6. 代码输出结果
var A = {n: 4399};
var B = function(){this.n = 9999};
var C = function(){var n = 8888};
B.prototype = A;
C.prototype = A;
var b = new B();
var c = new C();
A.n++
console.log(b.n);
console.log(c.n);
// 9999
// 4400
一、异步&事件循环
1.
因为没有写resolve,所以没有输出3
2.
3.
4.
5.
6.
7.
8.
9.
10.
.then
或.catch
返回的值不能是 promise 本身,否则会造成死循环。11. 代码输出结果
看到这个题目,好多的then,实际上只需要记住一个原则:
.then
或.catch
的参数期望是函数,传入非函数则会发生值传透。第一个then和第二个then中传入的都不是函数,一个是数字,一个是对象,因此发生了透传,将
resolve(1)
的值直接传到最后一个then里,直接打印出1。12. 代码输出结果
13. 代码输出结果
14. 代码输出结果
15. 代码输出结果
16. 代码输出结果
17. 代码输出结果
18. 代码输出结果
19. 代码输出结果
20. 代码输出结果
21. 代码输出结果
22. 代码输出结果
23. 代码输出结果
24. 代码输出结果
25. 代码输出结果
26. 代码输出结果
27. 代码输出结果
28. 代码输出结果
29. 代码输出结果
30. 代码输出结果
31. 代码输出结果
二、this
1. 代码输出结果
2. 代码输出结果
3. 代码输出结果
要注意的是,在严格模式中,null 就是 null,undefined 就是 undefined:
4. 代码输出结果
6. 代码输出结果
7. 代码输出结果
8. 代码输出问题
9. 代码输出结果
10. 代码输出结果
11. 代码输出结果
12. 代码输出结果
13. 代码输出结果
14. 代码输出结果
15. 代码输出结果
三、作用域&变量提升&闭包
1. 代码输出结果
2
3
4
5. 代码输出结果
6. 代码输出结果
7
8
四、原型&继承
1
2
3
4. 代码输出结果
5. 代码输出结果
6. 代码输出结果
7. 代码输出问题
8 代码输出问题
9. 代码输出结果