Javascript中的this坑

Function this

在函数中使用this 一般都是指代全局范围的this。

如果在调用函数时使用new操作符,this就会变成一个新值,和全局就脱离了干系。

在JS中,嵌套函数可以通过闭包获取父函数的变量,但是这个嵌套函数没有继承this

一般我们会把this放在一个变量self里,来避免上面这种情况的发生

然而当我们需要把一个方法作为一个值传递给一个函数的时候并不管用

这时可以通过bind将实例和方法一起传给函数来解决这个问题

发大水

发表在 Javascript | 4条评论

ng-repeat循环嵌套获取外层index

在父级ng-repeat时利用ng-init写入一个变量即可,子循环是可以访问到的。

发表在 Javascript | 留下评论

转:socket.emit 和 socket.broadcast.emit的区别

服务器信息传输

上述集中方式为socket.io常用的数据传输方式,

回调函数的socket参数为一个 client 与服务器的连接标示,不同的 client 会有不同的连接标示。

不分组,数据传输

  • socket.emit
    socket.emit 信息传输对象为当前 socket 对应的 client ,各个client socket 相互不影响。
  • socket.broadcast.emit
    socket.broadcast.emit 信息传输对象为所有 client ,排除当前socket 对应的 client 。
  • io.sockets.emit
    信息传输对象为所有 client 。

分组数据传输

类似于之前提过的 of 方法生成命名空间来管理用户, socket.io 可以使用分组方法, socket.join() ,以及与之对应的 socket.leave() 。

假设有两个聊天室,一个名为firefox,另一个为chrome,客户端操作

socket.emit('firefox') ,就可以加入 firefox 聊天室;
socket.emit('chrome') ,就可以加入 chrome 聊天室;

向一个分组传输消息,有两种方式:

broadcast 方法允许当前 socket client 不在该分组内。

可能有一个疑问,一个 socket 是否可以同时存在于几个分组,等效于一个用户会同时在几个聊天室活跃,答案是”可以“, socket.join() 添加进去就可以了。官方提供了订阅模式的示例:

后台处理订阅/退订事件

前端触发订阅/退订事件,就可以加入对应的聊天室。 通过 of 方法也可以通过划分命名空间的方式,实现聊天室功能,但不如分组管理来的方便。

Socket.io难点大放送(暂时没有搞定)

  • 授权验证
    socket 连接需要添加权限验证,让已登录的用户 socket 连接到服务器,未登录的用户无条件拒绝。全局授权管理如下:

callback 函数有两个参数,第一个为 error ,第二个参数为是否授权bool值,通过授权回调函数应为 callback(null,true) ,其它情况下都为拒绝建立连接。

按照web的开发方式,检测是否登录首选 cookie-session 来实现,问题也是出在这里。 websocket 握手阶段属于 HTTP 协议,简单来说是可以读到cookie,就可以实现session。
+ 精准单用户推送
理论上来说

就可以向一个特定用户推送消息,但是如何获得这个 socketId ,就是生成一个哈希数组,key为username,值为socket.id,这样就可以通过用户名获取对应的id,进而可以向特定client推送消息。

发表在 nodejs | 2条评论

Javascript学习笔记(一)

构造函数模式

在Javascript中,我们可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。在使用百度地图API自定义控件时,我们就用到了这种方法。如:

区别于工厂模式,这种方法没有显示地创造对象,并且直接将属性和方法赋给了this对象。同时构造函数始终应该以一个大写字母开头,而非构造函数以小写字母开头。

1.将构造函数当作函数

任何函数只要通过new操作符来调用,那它就可以作为构造函数;而任何函数。如果不通过new来调用,它和普通函数没什么两样。

 2.构造函数的问题

使用构造函数主要的问题,就是每个方法都要在实例上重新创造一遍。为了解决这个问题

3.原型模式

我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。prototype就是通过调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。

 

发表在 Javascript | 留下评论