几个变态的JS问题

该博客包含21道JavaScript面试题,涉及变量提升、闭包、作用域、函数参数传递等知识点。通过代码示例展示问题,并在注释中给出部分题目的答案及相关分析,有助于深入理解JavaScript的特性和机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值