<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<!-- 几个有趣有深度的问题 ,能全对的你太牛B!!!!你已上天!-->
<!-- *为难度等级 -->
<body>
<script>
// 1--------------------------- **
if (!("a" in window)) {
var a = 1;
}
console.log(a);
document.write(a);
// 2------------------------------- **
console.log(a);
var a = 12;
function fn() {
console.log(a);
var a = 13;
}
fn();
console.log(a);
// 3---------------------------------------- *
console.log(a);
var a = 12;
function fn() {
console.log(a);
a = 13;
}
fn();
console.log(a);
// 4----------------------------------------- **
console.log(a);
a = 12;
function fn() {
console.log(a);
a = 13;
}
fn();
console.log(a);
// 5------------------------------------ **
var foo = 1;
function bar() {
if (!foo) {
var foo = 10;
}
console.log(foo);
}
bar();
// 6--------------------------- ,变态等级***星
var n = 0;
function a() {
var n = 10;
function b() {
n++;
console.log(n);
}
b();
return b;
}
var c = a();
c();
console.log(n);
// 7--------------------------- *
var a = 10,
b = 11,
c = 12;
function test(a) {
a = 1;
var b = 2;
c = 3;
}
test(10);
console.log(a);
console.log(b);
console.log(c);
// 8----------------------
var a = 4;
function b(x, y, a) {
console.log(a);
arguments[2] = 10;
console.log(a);
}
a = b(1, 2, 3);
console.log(a);
// 9-----------------------------------
function fn(x, y) {
var arg = arguments;
arg[0] = 100;
console.log(x);
y = 200;
console.log(arg[1]);
}
fn(10);
// 10------------------------------------****
var num = 10;
var obj = { num: 20 };
obj.fn = (function(num) {
this.num = num * 3; //WIN:60
num++; //21
return function(n) {
this.num += n;
num++;
console.log(num);
};
})(obj.num);
var fn = obj.fn;
fn(5); //65
obj.fn(10); //
console.log(num, obj.num);
// 11---------------------------------- ***
var num = 10;
obj = { num: 20 };
obj.fn = (function(num) {
num = this.num + 10;
this.num = num + 10; //WIN:30 num:20
return function() {
this.num += ++num; //win:51
};
})(num);
var fn = obj.fn;
fn();
obj.fn();
console.log(num, obj.num);
// 12---------------------------------****
function Fn() {
var n = 10;
this.m = 20;
this.aa = function() {
console.log(this.m);
};
}
Fn.prototype.bb = function() {
console.log(this.n);
};
var f1 = new Fn();
Fn.prototype = {
aa: function() {
console.log(this.m + 10);
}
};
var f2 = new Fn();
console.log(f1.constructor);
console.log(f2.constructor);
f1.bb();
f1.aa();
f2.bb();
f2.aa();
f2.__proto__.aa();
// 13-------------------------------**
var a = 12,
b = 13,
c = 14;
function fn(a) {
console.log(a, b, c);
var b = (c = a = 20);
console.log(a, b, c);
}
fn(a);
console.log(a, b, c);
// 14------------------------------------*** 函数参数为引用类型时,传递其类型的引用(指针)。函数中的局部变量
var ary = [12, 23];
function fn(ary) {
console.log(ary);
ary[0] = 100;
ary = [100];
ary[0] = 0;
console.log(ary);
}
fn(ary);
console.log(ary);
// 15----------------------------**
var n = 10;
function fn() {
var n = 20;
function f() {
n++;
console.log(n);
}
f();
return f;
}
var x = fn();
x();
x();
console.log(n);
// 16-------------------------------------***闭包问题
var i = 1;
function fn(i) {
return function(n) {
console.log(n + ++i);
};
}
var f = fn(2);
f(3);
fn(5)(6);
fn(7)(8);
f(4);
// 17-------------------------------**栈内存释放问题
var a = 9;
function fn() {
a = 0;
return function(b) {
return b + a++;
};
}
var f = fn();
console.log(f(5));
console.log(fn()(5));
console.log(f(5));
console.log(a);
// 18---------------------------------**
function fn(i) {
return function(n) {
console.log(n + ++i);
};
}
var f = fn(10);
f(20);
fn(20)(40);
fn(30)(50);
f(30);
//19------------------------------*
var i = 10;
function fn() {
return function(n) {
console.log(n + ++i);
};
}
var f = fn();
f(20);
fn()(20);
fn()(30);
f(30);
// 20--------------------------------------****
// 变量(函数)提升后,在代码从上到下顺序执行时,在遇到方法(function)跳过不会执行
function Foo() {
getName = function() {
console.log(1);
};
return this;
}
Foo.getName = function() {
console.log(2);
};
Foo.prototype.getName = function() {
console.log(3);
};
var getName = function() {
console.log(4);
};
//下面代码到这不执行,已经全部提升
function getName() {
console.log(5);
}
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
// 21----------------------------------*****(逆天题)
function fn1(){console.log(1);}
function fn2(){console.log(2);}
fn1.call(fn2);
fn1.call.call(fn2);
Function.prototype.call(fn1);
Function.prototype.call.call(fn1);
</script>
<!-- <script>
function fn(){ var a = 1,b= 1; return a+b}
var ff = fn;
document.write(ff);
</script> -->
</body>
<!--
前段面试题讲解--
1:undefined; 2:undefined undefined 12; 3:undefined 12 13; 4:error; 5:10;
6:11 12 0 ; 7:10 11 3; 8:3 10 undefined;
9:100 undefined arg(arguments这个伪数组)以索引为基础,
“映射时”不存在的不予关联 arguments的映射机制建立在与函数形参赋值的一瞬间
10:22 23 (全局下的num):65 (obj中的num):30
11: 51 42;
12: Fn Object undefined 20 报错 20 NaN
16: 私有作用域以及内存释放
-->
<!-- in:检测某一个属性隶属于这个对象(不管是私有还是公有,只要有属性结果就是true) -->
<!-- hasOwnProperty:检测某一个属性是否为对象的私有属性 -->
</html>