提纲挈领:
今天维护代码时多次发现:函数调用时后面有两个括号,如:
平常进行函数调用时用的都是一个括号,查了一个资料才知道:原来知道一个函数里返回的是另外一个函数,就可以用两个括号了,如:
- function fn(m) {
- return function(n) {
- return m +'与' + n + '前端学习';
-
- }
- }
- let result = fn('小明')('小红');
- console.log(result);
-
结果图:
输出的结果是:
题目1:
- var name = "The Window";
- var object = {
- name : "My Object",
- getNameFunc : function(){
- return function(){
- return this.name;
- };
- }
- };
- console.log(object.getNameFunc()());
- //The Window
注释:getNameFunc前面没有使用var关键字,它是一个全局变量,而不是局部变量。所以它读的是全局变量the window,返回的this.name是the window。
题目2【题目1的延伸】
- var name = "The Window";
- var object = {
- name : "My Object",
- getNameFunc : function(){
- var that = this;
- return function(){
- return that.name;
- };
- }
- };
- console.log(object.getNameFunc()());
- //My Object
-
题目1和题目2的小结:
在函数内部使用var声明变量时,声明的是局部变量,函数外部是无法访问的。没有用var声明的变量是全局变量,函数外部是可以访问到的。
情况1:【在函数内部使用var声明变量时,函数外面访问不到】
- const fun = () => {
- //使用var声明
- var a = 1
-
- //不使用var声明
- q = 1
- }
- fun()
- console.log(a) //a is not defined
- //console.log(q) //1
情况2:【在函数内部没有var声明变量时,函数外面可以访问】
- const fun = () => {
- //使用var声明
- var a = 1
-
- //不使用var声明
- q = 1
- }
- fun()
- //console.log(a) //a is not defined
- console.log(q) //1
在全局作用域下使用var声明变量是不可删除的,不使用var声明的变量是可以删除,它为全局变量中的一个属性,一般在浏览器中全局变量为windows。
- var a = 1
- b = 2
- c = 3
- console.log(a) //1
- console.log(b) //2
-
- delete a //无法删除,会报错
- delete b //删除
-
- console.log(a) //1
- console.log(b) //b is not defined
- console.log(window.c) //3
题目3:
- var nAdd;
- function out(){
- var n = 999;
- nAdd = function(){
- n ++; //++在后,先执行后自增
- // 如果是上一行的代码是console.log(n++),则输出999
- console.log(n)//1000 此时n已经自增为1000
- }
- return function(){
- console.log(n);
- }
- }
- var getN = out();
- getN();//999 因为nAdd尚未执行
- nAdd();//1000
- getN();//1000 nAdd执行后,n为1000
我的解释:只有nAdd()函数执行之后return的值才会间接的改变掉外部函数的局部变量n值。