首页
Search
1
解决visual studio code (vscode)安装时没有选择安装路径问题
320 阅读
2
如何在 Clash for Windows 上配置服务
215 阅读
3
Linux 下 Bash 脚本 bad interpreter 报错的解决方法
150 阅读
4
Arch Linux 下解决 KDE Plasma Discover 的 Unable to load applications 错误
149 阅读
5
uniapp打包app提示通讯录权限问题,如何取消通讯录权限
113 阅读
clash
服务器
javascript
全部
游戏资讯
登录
Search
加速器之家
累计撰写
1,190
篇文章
累计收到
0
条评论
首页
栏目
clash
服务器
javascript
全部
游戏资讯
页面
搜索到
753
篇与
的结果
2024-10-21
js的数组问题
1. 遇到的问题 # 前天在写js时,遇到了一个很奇怪的问题:我有两个数组变量a、b,在经过一些运算后,数组b中有一些值,然后我就把数组b中的数据整体存入到数组a中(a.push(b)),然后就改变了数组b中的值(b.push(55), b.pop(), b[2]=100)。可是我最后从数组a中拿数据时,发现数组a中的数据竟然变了。我当时就纳闷了,我不是已经把数据存进去了么,为什么会变呢?而且如果把数组b清空后就不影响数组a中的值。 2. 解决方案 # 这样的情况,解决方案有3种: 将数组b设置为局部变量,当重新使用数组b时,就是重新声明了,与之前的数组b无关; 当然,有时候数组b其他地方可能也需要用到,不能讲数组b设置为局部变量,那么就在数组b的数据存入数组a之前,设置一个局部变量,先把数组b的数据存入到这个局部变量中,局部变量再存入到数组a中,之后数组b再改变时就不影响数组a了 当使用完数组b后,将数组b清空。其实这个跟第二种方法相似,本方法是清除数组b的指针引用,而第二种方法是清除局部变量的指针引用,因为他重新进行了声明。 以上的三种清空只能根据实际情况进行选择,而不是说哪个简单就选哪个。在我的项目中,就不能使用1和3,只能使用第二种情况。 3. 内部原理 # js数组其实本质是object,我们使用数组a进行push时,只是push了这个数组b的引用(指针1),其他地方(指针2)改变这个数组b的值时,数组a通过这个指针1获取到的数据也相应的改变了,因为这两个指针访问的是同一个地方。那么解决这个问题的办法就是上面的三种,要么让指针1的指向失效,要么就借助一个局部变量。 4. 总结 # 凡事多想个为什么,多试验一下,就能让我们更明白这个问题。
2024年10月21日
5 阅读
0 评论
0 点赞
2024-10-21
javascript模块化编写
1. 开篇语 # 现在我们写代码不再是一个人包办所有的活儿,都是在多人合作的情况下完成的。我们只需要负责自己的这块就行了,而且我们也希望别人的代码尽量少的影响到自己的代码,同时我们的代码也尽量少的影响到别人的代码。因此我们就需要对自己的js代码进行模块化,防止产生更多的全局变量! 2. 对象形式写法 # var SSS = { top:0, left:0, init:function(){ var self = this; console.log("top:"+self.top); self.check(); }, check:function(){ var self = this; console.log("left:"+self.left); } }; 3. 立即执行函数写法 # var Nan = (function(){ var top = 0; var left = 0; function getTop(){ return top; } return { getTop:getTop } })(); 4. prototype写法 # function Hello(options){ this.config = { top:0, left:0 }; this.init(options); } Hello.prototype = { constructor:Hello, init:function(options){ this.config = $.extend(this.config, options || {}); var self = this, _config = self.config, _cache = self.cache; self._bindEnv(); }, _bindEnv:function(){ var self = this, _config = self.config, _cache = self.cache; console.log(self.config); } } 5. 总结 # this不存在Object对象中的,它只存在一个Function类型的函数中 this指向使用new操作符实例化其所在函数的实例对象 this还指向调用其所在函数的对象 引用:阮一峰的《javascript模块化编程》:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html《理解JavaScript中的this》:http://www.2cto.com/kf/201204/129617.html
2024年10月21日
6 阅读
0 评论
0 点赞
2024-10-21
代码演示神器——jsfiddle
jsfiddle 网站已停止服务,以下内容已失效。 1. 介绍 # 很多时候,我们需要在我们写的文章或博客中,即时显示出我们写的 demo,能方便的解释出我们的思路。很久之前我也写过一篇文章,说的是如果利用博客园自己的资源来创建一个 demo,只不过这样做的一个坏处是,文章列表中会产生很多的 demo 标题,而那些文章只是我们在其他文章中引用而已,没必要有个标题专门显示出来。前几天无意间发现了 jsfiddle,看到的第一感觉就是:哇,这么牛 X,给你 32 个赞!不过我也是刚开始用这个,还有很多的功能没有发掘出来,有什么不对的地方,望指正!jsfiddle 的官网:http://jsfiddle.net/ 2. jsfiddle 的具体使用 # 进入官网后,我们看到的是这样的界面:界面主要是分为了三部分:左侧:添加一些必要的链接或者其他的一些什么东西。比如我们写 js 时需要用到 jquery,那么我们就把 http://code.jquery.com/jquery-1.8.0.min.js 这个链接引入,就能在 js 这个编辑框里写 jquery 代码了。当然引入其他的文件应该也是可以的。上侧:没标出来的那两个按钮我目前还不知道怎么使用。运行:当把所有的代码完成后,点击“运行按钮”,就能在"result"框里看到运行的结果;保存:运行之后没什么问题了,就可以保存了,网页就会跳转到一个新的页面,url 地址就是你这个项目的地址,复制出来直接使用就行了,而且我们还看到了 share 按钮:share 按钮的下拉表里提供了三种选择:项目的 url 链接地址,项目的全屏展示地址,iframe 框架的代码。我们可以根据自己的需要,复制我们需要的地址。代码格式化:能够将我们写的代码按比较正规的方式进行呈现。纠错:当我们点击运行按钮没反应时,我们可以用这个代码进行适当的纠错。不过感觉这个的纠错不是完全的可信,有时候不准。做好的方案就是:自己先把代码写完运行没问题了,再粘贴过来。还有就是,我们可以展示我们需要的代码,就按“项目的全屏展示地址”为例,它默认展示的只是 result 模块,我们如果想展示 html 和 js,可以这样写:http://jsfiddle.net/bingbing/J965R/embedded/result,html,js/。而且模块展示的顺序就是我们在 url 中写的顺序,我们把 result 写在了第一个,那么默认展示的就是 result;如果我们把 js 写在第一个,那么默认展示的就是 js。当然了,大部分的情况默认展示的应该都是 result。需要注意的是:当我们在博客园的文章源码里插入“iframe 的框架代码”时,不能直接这样写,而是应该把 src 里的逗号换成%2C:http://jsfiddle.net/bingbing/J965R/embedded/result%2Chtml%2Cjs%2Ccss。这里插入一个代码演示的 demo,点击 div,能够随机变换背景颜色。 3. 总结 # 也没什么好总结的,希望能够发掘出 jsfiddle 更多的功能。
2024年10月21日
6 阅读
0 评论
0 点赞
2024-10-21
微信接口开发-初级体验
1. 微信接口的注册 # 进入到微信开发的官网(https://mp.weixin.qq.com)进行注册。不过注册时需要一张手持身份证的照片,一些必要的信息该写的都写上,运营主体就选择个人就行了,我们本来也就是测试着玩呢。到这里会让我们选择,不过我们只能选择“订阅号”,然后点击“下一步”。“恭喜你,成功创建了一个公众账号”。这里需要说明的是,申请的账号,得需要审核,在审核期间,有些功能我们是无法看到和使用的。 2. 申请成为开发者 # 待账号审核完毕后,在“高级功能”中选择“开发模式”,具体的操作点我。填写 URL 和 Token,其中 URL 是我们自己涌来接收服务器数据的 url 地址,这就需要我们有自己的线上地址。推荐使用 bae(百度开发云平台),当然,有自己的服务器和线上域名就无所谓了。Token 值可随意填写。从文档中下载 PHP 示例代码部署到自己的服务器上,代码中修改 token 值,使两者的 token 值保持一致验证 URL 有效性成功后即接入生效,成为开发者。 3. 申请测试账号 # 成为开发者还没完呢,还需要“申请测试账号”。申请成功后,会得到属于自己的 appID 和 appsecret,(把这两个先保存起来,会经常用到)这里同样需要配置接口信息。用自己的微信关注一下二维码,于是我们的公众账号就有了第一个用户。用户列表中的“微信号”我们会多次用到的。 4. 获取 access_token 值 # 这里需要说明的是:这里的 token 值不是我们刚才配置的 token 值,而是我们进行各种操作时,服务器给我们的凭证。 返回到“开发模式”的页面,点击“接口在线调试”:接口类型选择“基础支持”,接口列表选择“获取 access_token 接口/token”,appid 和 secret 就填写自己刚申请带的 appID 和 appsecret。点击“检查问题”,服务器会返回到相应的结果。返回结果:200 OK,我们成功的获取到了access_token,在之后其他接口的调用中我们就可以使用 access_token 了,不过这里要注意的是,重复获取 access_token,会导致上次的失效,而且 access_token 的有效期只有 7200 秒,过期后需要重新获取。 5. 调用接口 # 现在我们向用户发送一条消息,具体操作来点我。接口类型选择“向用户发送消息”,access_token 填写我们刚才获取到的值,body 里填写的是 json 格式的数据:{ "touser": "OPENID", "msgtype": "text", "text": { "content": "Hello World" } } OPENID 就是关注我们微信的微信号,参考第三步;content 是我们要发送的内容。点击“检查问题”,若返回结果是 200 OK,说明我们的消息已经发送成功,手机也能接收到发送出来的信息。其他的接口也是类似的调用。 6. 自己编写程序 # 说了这么多都是在人家的网站上进行接口调试,如果我们要自己实现呢。微信的开发流程其实是这样的:用户 → 微信服务器 → 自己的平台 → 微信服务器 → 用户。用户发送的所有信息都会通过微信服务器送到我们自己的那个平台上,然后我们就可以实现我们想要的功能了。现在我要实现的是自动回复功能。我们从文档中下载的 php 示例代码就已经有处理发送信息的功能,不需要我们自己再进行编写了,responseMsg()就是实现的这个功能。而且,在代码的最上方,我们不能再调用 valid()方法了,得改成这样:$wechatObj->responseMsg();保存以后,试试用客户端发送一下消息试试。这就说明我们的程序已经调试成功了,当然,回复的类型还有很多种,图片啦,视频啦,等等。 7. 总结 # 这里只是简单的写了下自己学习过程中的总结,而且也只是学习了一点点,可能还有很多不对的地方,欢迎指正。
2024年10月21日
13 阅读
0 评论
0 点赞
2024-10-21
对js闭包的一些理解
对 js 的闭包看了很多遍,只是每次都没有进行深入的了解,过去了就忘了。这次也算比较深入的了解了一下吧,不过应该也有很多不足的地方,嘿嘿! 1. 了解闭包前必要知道的概念 # 在我们开始探索闭包前,我们首先应该理解清楚一些必要的概念,这样对我们之后理解闭包有很大的帮助。每个变量都有其作用的范围,全局变量全局有效,会一直驻扎在内存中;局部变量一般情况下会在函数执行完毕之后,就会销毁。这里要提到一个作用域链的重要概念,作用域链是当代码在一个环境中执行时创建的,作用域链的用途就是要保证执行环境中能有效有序的访问所有变量和函数。作用域链的最前端始终都是当前执行的代码所在环境的变量对象,下一个变量对象是来自其父亲环境,再下一个变量对象是其父亲的父亲环境,直到全局执行环境。其实,通俗的理解就是:在本作用域内找不到变量或者函数,则在其父亲的作用域内寻找,再找不到则到父亲的父亲作用域内寻找,直到在全局的作用域内寻找!一般情况下呢,当函数执行完毕后,局部变量就会被销毁,内存中仅保存这全局作用域。这里也涉及到了 js 的垃圾回收机制,在 js 中有两种垃圾收集的方式:标记清除和引用计数。标记清除:垃圾收集器在运行时会给存储在内存中的所有变量都加上标记(具体的标记方式暂时就不清楚了),待变量已不被使用或者引用,去掉该标记或添加另一种标记。最后,垃圾收集器完成内存清除工作,销毁那些已无法访问到的这些变量并回收他们所占用的空间。不过,闭包可不是说函数执行完了,变量就回收了。 2. 闭包的简要解释 # 这里简单解释一下闭包的概念:闭包使之有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数的内部创建另一个函数。首先我们看一个简单的例子。function createA() { var c = 0; return function () { c++; return c; }; } 这就是一个简单的闭包了: var func = createA(); 从代码中可以看出,func 是一个 Function 类型的变量,让我们执行以下:func();结果会发现输出了 1。多次执行以下 func()函数,发现输出的结果一直在增长。这就说明,在 func()执行之后,变量 c 依然保存在内存中,没有被释放掉。在 return 的 function 中能够使用变量 c 我们能够理解,因为变量 c 是其父亲环境中的变量,在本环境中找不到变量 c 时就会去父亲环境中寻找。再来看一个例子:function createB() { var result = []; for (var i = 0; i < 10; i++) { result[i] = function () { return i; }; } return result; } var result = createB(); 我们期望的是执行result[0]()能够返回 0,执行result[1]()能够返回 1,以此类推。可是实际上呢,每个函数返回的都是 10.这是因为每个函数的作用域链中都保存着 createB()函数的活动对象,所以它们引用的都是同一个变量 i。当 createB()函数返回后,变量 i 的值是 10,此时每个函数都引用着保存变量 i 的同一个变量对象,所以每个函数内部 i 的值都是 10.不过我们可以通过这样的设定来让闭包的行为符合我们的预期。function createB() { var result = []; for (var i = 0; i < 10; i++) { result[i] = (function (num) { return function () { return num; }; })(i); } return result; } var result = createB(); 3. 闭包的应用场景 # 在内存中维持一个变量。比如前面讲的小例子,由于闭包,函数 createA 中的 c 会一直存在于内存中,因此每次执行 func(),都会给变量 c 加 1. 保护函数内的变量安全。还是以最开始的例子,函数 createA()中的变量 c 只有内部的函数才能访问,而无法通过其他途径访问到,因此保护了变量 c 的安全。 实现面向对象中的对象。javascript 并没有提供类这样的机制,但是我们可以通过闭包来模拟出类的机制,不同的对象实例拥有独立的成员和状态。 这里我们看一个例子:var student = (function () { var name = 'bing'; var score = 80; return { getName: function () { return name; }, setName: function (thisName) { name = thisName; }, }; })(); 分别执行下面的语句:student.name; student.getName(); student.setName('zhongguo'); student.getName(); 可以看到,变量 student 是不能直接访问变量 name 的。只能通过 getName 和 setName 来对变量 name 进行读写操作。针对第三点,我们看这样的一个例子。function Student() { var name = 'bing'; return { getName: function () { return name; }, setName: function (thisName) { name = thisName; }, }; } 分别创建两个对象 stu1,stu2:var stu1 = Student(); stu1.setName('beijing'); stu1.getName(); var stu2 = Student(); stu2.setName('shanghai'); stu2.getName(); stu1.getName(); 输出的结果分别是:"beijing", "shanghai", "beijing"。可以发现 stu1,stu2 这两个对象之间相互独立,互不影响。 4. 闭包的另一种写法 # 在 jQuery 中我们经常见这样的写法:(function (x, y) {})(3, 5); 这是立即执行的匿名函数,匿名函数也是一种闭包。我们来看这个:for (var i = 0; i < 10; i++) { (function (i) { setTimeout(function () { console.log(i); }, i * 1000); })(i); } 这段代码是每隔 1000ms 依次输出:0, 1, 2, 3, 4, 5, 6, 7, 8, 9如果我们不使用匿名函数,直接在 for 循环里写 setTimeout 会是什么结果呢,这就回到了第二部分讨论的问题,setTimeout 也是一个函数呀,他使用了外部环境的变量 i,因此每隔 1000ms 输出一个 10,最后输出十个 10。
2024年10月21日
18 阅读
0 评论
0 点赞
1
...
31
32
33
...
151