💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 一、介绍 > javascript中的沙箱并非传统意义上的沙箱,只是一种语法上的hack写法而已,javascript中处理模块依赖关系的闭包被称之为沙箱,和 ajax一样,这种sandbox coding风格是一种现象,而不是本质,本身并无对错之分,要看你怎么用,因此,理解并合理运用才是我们对“js沙箱”的一个正确的基本态度。 ——沙箱是一个工具。就和键盘和鼠标一样,我们需要他,但更要看我们怎么用他。 沙箱模式(Sandbox Pattern),顾名思义沙箱模式是创建了一个"沙箱",可以理解为创建了一个黑盒,我们不管在里面做什么都不会影响到外面。而在JavaScript中就意味着,在沙箱中的操作被限死在当前作用域,不会对其他模块和个人沙箱造成任何影响。 ## 二、固定格式的写法 modules必须是数组,callback必须是函数,两个参数都要传不然会报错。 ~~~ (function(w) { var Sandbox = function(modules, callback) { if(!(this instanceof Sandbox)) { return new Sandbox(modules, callback); } for(var i=0, len=modules.length; i<len; i++) { Sandbox.modules[modules[i]](this); } callback(this); } Sandbox.modules = {}; w.Sandbox = Sandbox; })(this); Sandbox.modules.get = function() { alert('123123'); } Sandbox(['get'], function() {}); ~~~ ## 三、兼容写法 ~~~ function Sandbox() { var args = Array.prototype.slice.call(arguments), // 参数转成数组形式 callback = args.pop(), // 取出数组最后一个元素(回调函数) modules = (args[0] && typeof args[0]==='string') ? args : args[0]; // 判断数组剩下内容的第一个元素 if(!(this instanceof Sandbox)) { // 如果不是沙箱实例,则实例化 return new Sandbox(modules, callback); } if(!modules || modules[0]==='*') { // 判断模块参数是否存在或者第一个参数是否是* modules = []; for(var i in Sandbox.modules) { if(Sandbox.modules.hasOwnProperty(i)) { modules.push(i); } } } for(var i=0; i<modules.length; i++) { // 循环模块调用 Sandbox.modules[modules[i]](this); } callback(this); // 回调 } Sandbox.prototype = { // 原型 name: 'sandbox', version: '1.0.0', getName: function() { return this.name; } } // 定义模块及调用 Sandbox.modules = {}; Sandbox.modules.event = function(box) { box.addEvent = function(selector, evtype, callback) { selector.addEventListener(evtype, callback); } } Sandbox(['event'], function(box) { box.addEvent(document, 'click', function(e) { alert(e.clientX+'px, '+e.clientY+'px'); }); }); ~~~ 沙箱是一种设计模式,用来避免过多的全局变量,而且能起到模块化开发,清晰思路的效果。。用不用不强求,好读书不求甚解。。