JS问题
- 2018-07-16 请问以下函数会输出什么>
//一:主要考查了闭包。二:函数在调用中this的指向。 三:块级作用域。
var num = 20;
var obj = {
num :30,
fn:(function(num){
this.num *= 3;
num += 15;
var num = 45;
return function(){
console.log(num,this);
//第一次输出45,window对象
//第二次输出65,obj对象
this.num *=4;
num += 20;
console.log(num);
//第一次输出65
//第二次输出85
}
})(num)
}
var fn = obj.fn;
fn();
obj.fn();
闭包
- 概念
闭包是指有权访问另一个函数作用域中的变量的函数
- 作用域链和活动对象
无论什么时候在函数中访问一个变量时,就会从作用域链中搜索具有相应名字的变量。一般来讲,当函数执行完毕后,局部活动对象就会被销毁,内存中仅保存全局作用域(全局执行环境的变量对象)。但是,闭包的情况又有所不同。----【闭包内部的一个函数,这里暂且定位该栗子中的匿名函数,外部的fn函数执行完之后,虽然其执行环境被弹出栈中,但是这个匿名函数的作用域链仍在引用这个活动对象,仍保留在内存中,直到匿名函数被销毁,外部函数的活动对象才会被销毁】 - this指向
this指向被用的函数(执行环境)
- JS模仿块级作用域
在块级作用域中,this指向window对象。
所以在第一次调用fn()方法时,其实是window.fn(),所以第一次this执行window对象,num由于是当前作用域链的执行环境对外部活动对象的引用所以num这时候为45,即在这个闭包中num为45,而this.num指向的是全局属性num为20,所以最终结果为65
在obj.fn()是,这时候this其实指向obj对象,所以this.num == 30 此时num已经为65,所以num+=20 为85
其实这个里面还涉及到了函数中的变量生命,改日再写。上面的图,改日再画。
- 2018-07-27 请问为什么console.log(‘b’+‘a’+ +‘a’+‘a’)结果为"baNANa"?
<!DOCTYPE html>
<html lang="zh">
<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>
<script type="text/javascript">
/*
* 一元运算符,只需要一个操作数
* + 正号
* - 正号不会对数字产生任何影响
* - 负号
* - 负号可以对数字进行负号的取反
*
* - 对于非Number类型的值,
* 它会将先转换为Number,然后在运算
* 可以对一个其他的数据类型使用+,来将其转换为number
* 它的原理和Number()函数一样
*/
一个表达式中如果有减号 (-)、乘号 (*) 或 除号 (/) 等运算符时,JS 引擎在计算之前,会试图将表达式的每个分项转化为 Number 类型(使用 Number(x) 做转换)。如果转换失败,表达式将返回 NaN 。如果其中有一个变量是字符串,则会将两边都作为字符串相加。
var a = 123;
a = -a;
a = true;
a = "18";
a = +a;
/*console.log("a = "+a);
console.log(typeof a);*/
var result = 1 + +"2" + 3;
console.log("result = " + result);
//count = 6
</script>
</head>
<body>
</body>
</html>