5
回答
js和jquery利用闭包做组件
自己写一个插件,单独调用没有问题,但是有2个元素进行调用的时候,内部参数就会影响,知道闭包可以解决,但是不会写.求告知js组件的闭包怎么写,jquery组件的闭包怎么写.只要外面的模式就可以,里面的方法自己实现.
举报
小小丁灬
发帖于2年前 5回/1K+阅
共有5个答案 最后回答: 2年前
你的插件是什么写的,如果是写成单例那就有影响,如果是不同的元素调用是就new一个对象的话,那就不会相互影响。js方法就是也是一种闭包,里边的影响不到外边的。。。其实我还不太明白你想要到达什么效果。。
jquery 的闭包写法:   !function(w){  //.....  }(window);你问题描述的不够清晰,不好针对性的给出详细答案,最好有贴出部分代码。

闭包是伴随着作用域而生的,js中只有全局作用域和函数作用域。所以,闭包一般和函数相关。确切的说,是函数中的函数。举几个例子:

example1:

function log() {
  var logs = [];
  return function(data, end){
    logs.push(data);
    end = end || false;
    if(end){
      var val = logs.join('##');
      console.log(val);
      logs = [];
    }
  }
}

var myLog = log();
myLog('a=1');
myLog('b=2');
myLog('c=3', true);



定义一个log函数,它会“缓存”一个名为“logs”的数组,然后返回另外一个函数。调用的时候先通过
var myLog = log()
获得这个内部函数,然后调用这个内部函数就可以了,这样“logs”的作用域就被牢牢的锁死了,只有myLog内部才能访问它。也可以变通一下。

example2:

var myLog = (function() {
  var logs = [];
  return function(data, end){
    logs.push(data);
    end = end || false;
    if(end){
      var val = logs.join('##');
      console.log(val);
      logs = [];
    }
  }
})();

myLog('a=1');
myLog('b=2');
myLog('c=3', true);



和第一个例子很像,区别是我在定义的时候直接返回这个内部函数。效果是一样的。再来一个例子。看看闭包是如何hold住数据的。

example3:

function plus(a) {
  return function(b) {
    return a + b;
  }
}

var add5 = plus(5);
console.log(add5(1));
console.log(add5(2));
console.log(add5(3));
console.log(add5(4));
console.log(add5(5));



add5在定义的时候就已经把“5”这个变量永远锁住了。不知道这样你能够理解一些了么?

上两个例子中的“logs”也好,plus函数的参数“a”也好,在内部函数中称作“自由变量”,也就是当内部函数执行的时候,并不能在自身的作用域内发现这个变量,即这个变量,既不来自内部函数的参数,也不是函数内部声明的,所以函数执行时会到“定义这个函数的”作用域内查找。很幸运,我们的例子中,向上查找一次就找到了。


顶部