演示代码
<html>
<body>
<script type="text/javascript">
"use strict"
console.log(`function define is first====》${reObject}`);
console.log(`var define is order====》${a}`);
var x = 1;
function reObject() {
return x;
}
console.log(`scope chain====》${reObject()}`);
function reNull() {
return null;
}
function reUndefined() {
//console.log("reUndefined");
}
function reFunction() {
var n = 1;
return function() {
console.log(`闭包函数 返回 内部对象n====》${n}`);
// console.log(reFunction);
};
}
var a = reObject();
console.log(`reObject return====》${a}`);
var b = reNull();
console.log(`reNull return====》${b}`);
var c = reUndefined();
console.log(`reUndefined return====》${c}`);
var d = reFunction();
console.log(`reFunction return====》${d}`);
console.log(`reFunction() return====》${d()}`);
x = 2;
var e = reObject();
console.log(`scope chain x====》${x}:reObject a====>${a}:reObject e====>${e}`);
</script>
</body>
</html>
函数定义式优先于对象直接量
console.log(`function define is first====》${reObject}`);
console.log(`var define is order====》${a}`);
function reObject() {
return x;
}
var a = reObject();
函数返回变量值拷贝
var x = 1;
function reObject() {
return x;
}
console.log(`scope chain====》${reObject()}`);
x = 2;
var e = reObject();
console.log(`scope chain x====》${x}:reObject a====>${a}:reObject e====>${e}`);
函数返回值的本质
var a = reObject();
console.log(`reObject return====》${a}`);
var b = reNull();
console.log(`reNull return====》${b}`);
var c = reUndefined();
console.log(`reUndefined return====》${c}`);
var d = reFunction();
console.log(`reFunction return====》${d}`);
console.log(`reFunction() return====》${d()}`);
当函数返回值为非函数时,返回的为简单对象,而当返回值为函数时,返回的为函数的引用,
其实函数即作用域,整个JavaScript对象都在顶层作用域内
var d = reFunction();
console.log(`reFunction return====》${d}`);
console.log(`reFunction() return====》${d()}`);
可以思考下,下面这句会打印什么?
console.log(`reFunction() return====》${d()}`);
d()执行时会调用函数定义的方法,同时它的执行本身没有任何返回值
![]()
闭包的本质
网友评论