#1179
展开↯#1180
作者:广西南宁市
微信内置浏览器的 User Agent
检测浏览器的 User Agent 应该是非常简单的事情
微信在 Android 下的 User Agent
微信在 iPhone 下的 User Agent
通过javascript判断
很容易看出来,微信的 User Agent 都有‘micromessenger’字符串标示,我们判断是否含有这些字符串就OK了
通过 PHP 判断
#,广西南宁市,2017-07-19,16:23:30, 大部分页面是判断UA来的, 但也有一部分页面是通过调用微信JS-SDK提供的方法,如果调用失败说明不在微信浏览器环境内,你可以尝试一下mock这些API #,广西南宁市,2017-07-19,16:24:14,
我知道的方法是 在浏览器 more tools->network conditions
User agent 把 select automatically 取消勾选
下面的输入框输入
#,广西南宁市,2017-07-19,16:28:17,
isWeixinBrowser
判断是否为微信内置浏览器
在微信公众账号开发中,一般会在微站点使用微信用户授权接口,但是我们的网站也需要在非微信环境中正常使用,这就需要判断当前的浏览器是微信内置的浏览器,那么如何判断呢?
判断微信浏览器浏览器中的User Agent,经过在 iPhone 上微信的浏览器的检测,它的 User Agent 是:
所以通过识别“MicroMessenger”这个关键字来确定是否微信内置的浏览器。
使用JavaScript 判断
使用PHP判断
检测浏览器的 User Agent 应该是非常简单的事情
微信在 Android 下的 User Agent
mozilla/5.0 (linux; u; android 4.1.2; zh-cn; mi-one plus build/jzo54k) applewebkit/534.30 (khtml, like gecko) version/4.0 mobile safari/534.30 micromessenger/5.0.1.352Run code
Cut to clipboard
微信在 iPhone 下的 User Agent
mozilla/5.0 (iphone; cpu iphone os 5_1_1 like mac os x) applewebkit/534.46 (khtml, like gecko) mobile/9b206 micromessenger/5.0Run code
Cut to clipboard
通过javascript判断
很容易看出来,微信的 User Agent 都有‘micromessenger’字符串标示,我们判断是否含有这些字符串就OK了
function isWeixinBrowser(){
var ua = navigator.userAgent.toLowerCase();
return (/micromessenger/.test(ua)) ? true : false ;
}Run code
Cut to clipboard
通过 PHP 判断
function is_weixin(){ if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false ) { return true; } return false; }Run code
Cut to clipboard
我知道的方法是 在浏览器 more tools->network conditions
User agent 把 select automatically 取消勾选
下面的输入框输入
MicroMessenger 微信
AlipayClient 支付宝Run code
Cut to clipboard
isWeixinBrowser
判断是否为微信内置浏览器
在微信公众账号开发中,一般会在微站点使用微信用户授权接口,但是我们的网站也需要在非微信环境中正常使用,这就需要判断当前的浏览器是微信内置的浏览器,那么如何判断呢?
判断微信浏览器浏览器中的User Agent,经过在 iPhone 上微信的浏览器的检测,它的 User Agent 是:
Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329 MicroMessenger/5.0.1Run code
Cut to clipboard
所以通过识别“MicroMessenger”这个关键字来确定是否微信内置的浏览器。
使用JavaScript 判断
function isWeixinBrowser() {
var agent = navigator.userAgent.toLowerCase();
if (agent.match(/MicroMessenger/i) == "micromessenger") {
return true;
} else {
return false;
}
}Run code
Cut to clipboard
使用PHP判断
function is_weixin() {
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {
return true;
}
return false;
}
function weixin_version() {
preg_match('/.*?(MicroMessenger\/([0-9.]+))\s*/', $_SERVER['HTTP_USER_AGENT'], $matches);
echo '你的微信版本号为:'.$matches[2];
}Run code
Cut to clipboard
文章:Weiphp微信公众平台自定义菜单等开发 发表时间:2017-07-19, 16:21:34
#1181
作者:广西南宁市
比烂果然是部分国人最后的遮羞布 #,广西南宁市,2017-07-19,11:41:55, 张嘴就来,马云在什么场合讲什么话的本事已经炉火纯青了。
文章:他不是脾气暴躁,只是不能被打扰 发表时间:2017-07-12, 11:41:50
#1182
作者:广西南宁市
ThinkPHP getBy动态查询
getBy动态查询
ThinkPHP getBy动态查询是一个魔术方法,可以根据某个字段名称动态得到对应的一条数据记录。
根据用户名(username)查询对应的用户资料记录:
方法中传入的参数是查询的字段对应的值,上面例子执行的 SQL 语句为:
SELECT * FROM user WHERE username = 'Admin' LIMIT 1
请注意,在getBy之后紧跟着的字段名称,首字母必须大写。对于如 user_name 这样的字段名称,以驼峰法自动识别下划线,即:
实际使用中可以灵活根据查询的字段名来定义 getBy 放入,如:getByEmail、getByTitle、getById 等。 #,广西南宁市,2017-07-19,11:16:34, ThinkPHP3.0,getById() 适合于编辑一条信息的时候,向模板里面传递数据
在编辑一条信息的时候,用getById()而没用find()或者select(),现阶段还不明白具体原因,并且,也没有搜到ThinkPHP里面有关于getById()的相关说明。
这样的用法,是在官方的实例里面看到的。
具体操作如下:
在模板里面,执行PHP代码是这样的:
就上面一段代码,解决了所有问题,而在模板里面,需要调用符合条件的某个字段的时候,只需在需要调用的地方这样写: #,广西南宁市,2017-07-19,11:17:41, thinkphp3.0增加setInc、setDec方法,今天查看thinkphp2.0的方法setInc、setDec时是这样写的:
而对于统计字段(通常指的是数字类型)的更新,系统还提供了 setInc 和 setDec 方法:
而tp3.0有了新的改动,这样写了,方便了不少:
必须配合连贯操作where一起使用
#,广西南宁市,2017-07-19,11:19:28, #,广西南宁市,2017-07-19,11:22:53,@3 ,
getBy动态查询
ThinkPHP getBy动态查询是一个魔术方法,可以根据某个字段名称动态得到对应的一条数据记录。
根据用户名(username)查询对应的用户资料记录:
public function chekUser(){
header("Content-Type:text/html; charset=utf-8");
$Dao = M("User");
// 查询数据
$user = $Dao->getByUsername('Admin');
if($list){
echo '用户名存在';
}else{
echo '用户名不存在';
}
}Run code
Cut to clipboard
方法中传入的参数是查询的字段对应的值,上面例子执行的 SQL 语句为:
SELECT * FROM user WHERE username = 'Admin' LIMIT 1
请注意,在getBy之后紧跟着的字段名称,首字母必须大写。对于如 user_name 这样的字段名称,以驼峰法自动识别下划线,即:
$user = $Dao->getByUserName('Admin');Run code
Cut to clipboard
实际使用中可以灵活根据查询的字段名来定义 getBy 放入,如:getByEmail、getByTitle、getById 等。
在编辑一条信息的时候,用getById()而没用find()或者select(),现阶段还不明白具体原因,并且,也没有搜到ThinkPHP里面有关于getById()的相关说明。
这样的用法,是在官方的实例里面看到的。
具体操作如下:
function index(){
$data = M(“User”); //实例化模型
$vo = $data->getById($_GET[‘id’]); //符合条件的ID
if($vo){
$this->assign(‘vo’,$vo);
$this->display();
}else{
$this->error(“编辑项不存在。”);
}
}Run code
Cut to clipboard
在模板里面,执行PHP代码是这样的:
<php>
//PHP代码
$type = $vo[字段名];
</php>Run code
Cut to clipboard
就上面一段代码,解决了所有问题,而在模板里面,需要调用符合条件的某个字段的时候,只需在需要调用的地方这样写:
{$vo.字段名}Run code
Cut to clipboard
而对于统计字段(通常指的是数字类型)的更新,系统还提供了 setInc 和 setDec 方法:
$User = M( "User" ); // 实例化 User 对象
$User->setInc( 'score','id=5',3 ); // 用户的积分加 3
$User->setInc( 'score','id=5' ); // 用户的积分加 1
$User->setDec( 'score','id=5',5 ); // 用户的积分减 5
$User->setDec( 'score','id=5' ); // 用户的积分减 1Run code
Cut to clipboard
而tp3.0有了新的改动,这样写了,方便了不少:
必须配合连贯操作where一起使用
$User = M("User"); // 实例化User对象
$User->where('id=5')->setInc('score',3); // 用户的积分加3
$User->where('id=5')->setInc('score'); // 用户的积分加1
$User->where('id=5')->setDec('score',5); // 用户的积分减5
$User->where('id=5')->setDec('score'); // 用户的积分减1Run code
Cut to clipboard
UPDATE user SET score=score+3 WHERE uid = 2Run code
Cut to clipboard
mysql CONCAT()函数用于将多个字符串连接成一个字符串,是最重要的mysql函数之一,下面就将为您详细介绍mysql CONCAT()函数,供您参考
mysql CONCAT(str1,str2,…)
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。或许有一个或多个参数。 如果所有参数均为非二进制字符串,则结果为非二进制字符串。 如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型 cast, 例如: SELECT CONCAT(CAST(int_col AS CHAR), char_col)
mysql> SELECT CONCAT(’My’, ‘S’, ‘QL’);
-> ‘MySQL’
mysql> SELECT CONCAT(’My’, NULL, ‘QL’);
-> NULL
mysql> SELECT CONCAT(14.3);
-> ‘14.3′
mysql CONCAT_WS(separator,str1,str2,…)
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。 第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。
mysql> SELECT CONCAT_WS(’,',’First name’,'Second name’,'Last Name’);
-> ‘First name,Second name,Last Name’
mysql> SELECT CONCAT_WS(’,',’First name’,NULL,’Last Name’);
-> ‘First name,Last Name’
mysql CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。Run code
Cut to clipboard
文章:Weiphp微信公众平台自定义菜单等开发 发表时间:2017-07-19, 11:14:20
#1183
作者:广西南宁市
关键词回复图文点击链接URL

#,广西南宁市,2017-07-19,11:11:44,
文章:Weiphp微信公众平台自定义菜单等开发 发表时间:2017-07-19, 11:01:53
#1184
作者:广西南宁市
Scope参数错误或没有Scope权限
订阅号无获取用户信息权限

#,广西南宁市,2017-07-19,11:06:49,
当 scope 为 snsapi_base的时候没有影响。但是scope为snsapi_userinfo 就会提示 scope参数错误或没有scope权限
官网文档说snsapi_base授权只能拿到openid的。而且我实践也发现,有时snsapi_base授权得到的access_token是拿不到用户信息的,
只有在关注的情况下snsapi_base才可以获取到用户信息,否则只能获取到openid #,广西南宁市,2017-07-19,11:07:04,@1 , 也不是, 有时候关注了, 也拿不到会48001 #,广西南宁市,2017-07-19,11:07:14,@1 ,
你猜想的没错,经过证明如果先使用snsapi_userinfo参数去调用接口,在使用snsapi_base调用接口,确实会取到其它的参数,而直接使用snsapi_base参数调用接口只能获取到openid。 #,广西南宁市,2017-07-19,11:10:11,@1 ,
微信公众号开发文档 关于网页授权回调域名的说明
订阅号无获取用户信息权限
当 scope 为 snsapi_base的时候没有影响。但是scope为snsapi_userinfo 就会提示 scope参数错误或没有scope权限
官网文档说snsapi_base授权只能拿到openid的。而且我实践也发现,有时snsapi_base授权得到的access_token是拿不到用户信息的,
只有在关注的情况下snsapi_base才可以获取到用户信息,否则只能获取到openid
你猜想的没错,经过证明如果先使用snsapi_userinfo参数去调用接口,在使用snsapi_base调用接口,确实会取到其它的参数,而直接使用snsapi_base参数调用接口只能获取到openid。
微信公众号开发文档 关于网页授权回调域名的说明
非静默授权的 URL 样例: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx841a97238d9e17b2&redirect_uri=http://cps.dianping.com/weiXinRedirect&response_type=code&scope=snsapi_userinfo
&state=type%3Dquan%2Curl%3Dhttp%3A%2F%2Fmm.dianping.com%2Fweixin%2Faccount%2Fhome
静默授权的 URL 样例: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx841a97238d9e17b2&redirect_uri=http://cps.dianping.com/weiXinRedirect&response_type=code&scope=snsapi_base
&state=type%3Dquan%2Curl%3Dhttp%3A%2F%2Fmm.dianping.com%2Fweixin%2Faccount%2FhomeRun code
Cut to clipboard
文章:Weiphp微信公众平台自定义菜单等开发 发表时间:2017-07-19, 11:03:24
#1185
作者:广西南宁市
努力不是盲目地延长工作时间,而是认真地提升工作效率 #,广西南宁市,2017-05-08,14:10:43, 翔有两个明显特点,刚出来时很热,狗狗们甚至能为了它连主人都咬;但热只是暂时的,冷掉是翔们必然的宿命,而一旦冷掉,则又硬又臭,连狗都不理。 #,广西南宁市,2017-05-08,14:12:35, 拉翔是刚需,但吃翔恐怕才是痛点吧! #,广西南宁市,2017-05-08,14:14:04, 大家都是学过数学的经济人,脑袋难道瓦塔了? #,广西南宁市,2017-07-18,16:27:37,
我会把简历中的内容,分为五个档次,有效性逐级递减:
资源
业绩
能力
知识
自评
一、资源——能带来什么
资源是你能完全把握,能够跟着你走的东西,是简历中最硬的内容。
做销售能带来多少客户,做财务的能搞定多少贷款,做采购的有多少多年合作的供应商。
对很多人来说,拿到一个好职位最重要的筹码,可能是生在一个好家庭。
对很多公司来说,干活最少的人可能是公司最重要的人。
二、业绩——做成过什么
业绩是往过成就,对很多领域来说,一次巅峰可以受用终生。
做过什么项目,实现什么目标,解决了什么问题,处理了什么突发事件,达成什么计划,获得什么奖项。越是竞争激烈的领域,越是参与人数众多,越是公开可查的业绩就越有价值。
当你拿着金牌的时候,你说什么都是对的。
三、能力——会解决什么问题
能力是体系化的知识,是经过实践打磨沉淀下来的智慧。知道怎么做计划,知道如何切入,知道如何破局,知道如何求得结果。
我们的收入和能解决的问题的价值成正比,和能解决问题的人数成反比。
解决有价值的问题,解决别人不能解决的问题,收入和地位都不会是问题。
四、知识——是什么和为什么
知识是能力底层的基石,知识不等于能力,但是丰富的知识可以转换成跟高的能力,而更高的能力可以创造更好的业绩。
除非是完全没有以上三条的应届生,否则简历中不应该强调知识。过于强调知识,等同于强调自己没有知识转化的能力。
互联网时代,知识获取的成本越来越低,如果你的知识停留在百度的水平上,很难赢得竞争。
五、评价——聪明人的小花招
价值最低的是主观评价,我们经常可以在简历中看到,熟练XX,精通XXX,这类主观评价,谁都知道这些套话没有任何意义。
稍有价值的是客观评价,喜欢读书,过去一年读了几本,爱好摄影,照过几张照片。
更有价值的是三方评价,前公司上司甚至老板的推荐信,相对来说参考意义就大的多。
无论是主观、客观还是三方评价,其实都说不上客观。不过看简历的HR和直属上司也绝对称不上是理性人。所以,一段真挚的自评,几句诚恳的推荐,能够打动很多人。 #,广西南宁市,2017-07-18,16:27:56, 
#,广西南宁市,2017-07-18,17:49:34, 不是纵容老赖,扼制催收就可以扼制放贷,良性循环
我会把简历中的内容,分为五个档次,有效性逐级递减:
资源
业绩
能力
知识
自评
一、资源——能带来什么
资源是你能完全把握,能够跟着你走的东西,是简历中最硬的内容。
做销售能带来多少客户,做财务的能搞定多少贷款,做采购的有多少多年合作的供应商。
对很多人来说,拿到一个好职位最重要的筹码,可能是生在一个好家庭。
对很多公司来说,干活最少的人可能是公司最重要的人。
二、业绩——做成过什么
业绩是往过成就,对很多领域来说,一次巅峰可以受用终生。
做过什么项目,实现什么目标,解决了什么问题,处理了什么突发事件,达成什么计划,获得什么奖项。越是竞争激烈的领域,越是参与人数众多,越是公开可查的业绩就越有价值。
当你拿着金牌的时候,你说什么都是对的。
三、能力——会解决什么问题
能力是体系化的知识,是经过实践打磨沉淀下来的智慧。知道怎么做计划,知道如何切入,知道如何破局,知道如何求得结果。
我们的收入和能解决的问题的价值成正比,和能解决问题的人数成反比。
解决有价值的问题,解决别人不能解决的问题,收入和地位都不会是问题。
四、知识——是什么和为什么
知识是能力底层的基石,知识不等于能力,但是丰富的知识可以转换成跟高的能力,而更高的能力可以创造更好的业绩。
除非是完全没有以上三条的应届生,否则简历中不应该强调知识。过于强调知识,等同于强调自己没有知识转化的能力。
互联网时代,知识获取的成本越来越低,如果你的知识停留在百度的水平上,很难赢得竞争。
五、评价——聪明人的小花招
价值最低的是主观评价,我们经常可以在简历中看到,熟练XX,精通XXX,这类主观评价,谁都知道这些套话没有任何意义。
稍有价值的是客观评价,喜欢读书,过去一年读了几本,爱好摄影,照过几张照片。
更有价值的是三方评价,前公司上司甚至老板的推荐信,相对来说参考意义就大的多。
无论是主观、客观还是三方评价,其实都说不上客观。不过看简历的HR和直属上司也绝对称不上是理性人。所以,一段真挚的自评,几句诚恳的推荐,能够打动很多人。
文章:他不是脾气暴躁,只是不能被打扰 发表时间:2016-10-11, 16:06:55
#1186
作者:广西南宁市
如果你儿子不努力,给他看这张图
如果你女儿不努力,给她看这张图

#,广西南宁市,2017-07-15,16:33:50,
2XXX年O月网信部微博办
办事员:下一位
你:中国复兴,是21世纪中国经济社会文化等历史发展的必然!您好,我想发一篇微博
办事员:坚持以人民为中心的创作导向,坚持文艺“为人民服务、为社会主义服务”的方向和“百花齐放、百家争鸣”的方针,好,身份证原件、复印件给我,这张表填好,发布日期时间要写详细。
你:坚定文化自信,坚持服务人民,勇于创新创造,坚守艺术理想,推出更多反映时代呼声、展现人民奋斗、振奋民族精神、陶冶高尚情操的优秀美术作品!好,给您。
办事员:“看得见多远的过去,就能走得向多远的未来。”内容有问题,这里需要修改。改完给我就好。
你:“雄关漫道真如铁”“人间正道是沧桑”“长风破浪会有时”!多谢,再见 #,广西南宁市,2017-07-15,16:34:08, 
#,广西南宁市,2017-07-15,16:35:24,@1 , 好的,那么现在时间是1983年7月14日下午两点三十分了吗? #,广西南宁市,2017-07-15,16:36:13,@1 , 看完后吓个半死,连夜爬起来看看,微博有没有给我塞僵尸粉。
确认了十遍,发现粉丝数还是0时,终于可以放心地睡一觉了……
^_^ #,广西南宁市,2017-07-15,16:36:30,@1 , 怕是它们预感到浪潮即将到来。不管浪潮是不是真的要来,它们现在所做的正是在推波助澜 #,广西南宁市,2017-07-15,16:37:40,@1 , 看谁不爽给他买波僵尸粉 #,广西南宁市,2017-07-17,10:23:43, 每个人都会有过疯狂,疯狂过后的现实才会让人明白,生活来不得半点儿戏! #,广西南宁市,2017-07-17,17:35:03, 作者赫拉利:人工智能的危险之处在于,它会打破权力的内在平衡
如果你女儿不努力,给她看这张图
2XXX年O月网信部微博办
办事员:下一位
你:中国复兴,是21世纪中国经济社会文化等历史发展的必然!您好,我想发一篇微博
办事员:坚持以人民为中心的创作导向,坚持文艺“为人民服务、为社会主义服务”的方向和“百花齐放、百家争鸣”的方针,好,身份证原件、复印件给我,这张表填好,发布日期时间要写详细。
你:坚定文化自信,坚持服务人民,勇于创新创造,坚守艺术理想,推出更多反映时代呼声、展现人民奋斗、振奋民族精神、陶冶高尚情操的优秀美术作品!好,给您。
办事员:“看得见多远的过去,就能走得向多远的未来。”内容有问题,这里需要修改。改完给我就好。
你:“雄关漫道真如铁”“人间正道是沧桑”“长风破浪会有时”!多谢,再见
确认了十遍,发现粉丝数还是0时,终于可以放心地睡一觉了……
^_^
文章:成功的故事只能倒叙着讲 发表时间:2017-07-15, 15:50:35
#1187
作者:广西南宁市
意思是说b要变成闭包的话,就必须被外包所引用,即c引用:
我认为这句话只是在说闭包的调用,并不是没有被c引用的话,闭包就不存在 #,广西南宁市,2017-07-14,17:07:52, 用对象调用的叫方法,直接调函数名的叫函数
车是一类对象,
你的车是实例。
车是class
我的车既是一个对象也是一个实例?
对象与实例表达的意思都一样啊,只是不同的说法而已。车可以包括单车,汽车等,具有车所应该有的一般特点:有车轮、可以载东西等等,那么具体到你的那辆汽车,就是车的一个实例或者说是对象。
我觉得对象是实际存在的 但可以=null
实例也是对象,但实例!=null
对象范围包括实例。
对象是:产品设计图纸;
实例是:根据图纸设计出来的产品.产品可以体现出图纸的设计思想;
图纸没有实际作用;
产品可以直接使用
女孩是个对象,,人家不都说谈对象吗
实例呢,就是老婆了,,有了主的女人,,当然这个女人也可能离婚,,的,,哈哈
某个具体的对象就是实例。。
两个有时候就是一个意思,class代表的是一类对象,而这个类中的某一个具体的对象就是一个实例。
比如说人这个类,你是属于人类的,那这个人就是一个具体的对象,也是人类的一个实例。
你是人么?你不是人,你属于人类,但是你不能代表人,你只是自己,属于人类的一个对象,也是人类的一个实例。。
其实两个我感觉就差不多是一会事。。
我觉得,对象是普遍的面向对象思想的概念,面向对象的思想并不只是针对面向对象编程而言的,即 OO != OOP。而实例,是面向对象程序设计中对对象的特有称谓,所以在针对某一门具体的面向对象的语言时,对象和实例指的是同一个事物。
对象引用!=对象
可以有多个对象引用指向同一个对象
对象=实例
不知道理解的对不对
呵呵,对象是一种类型,而实例具体的一个对象。
我们常常听老人说
帮你介绍个 “对象”
真的见面的时候 来的是一个姑娘/帅哥
这就是 对象 实例的区别
对象是概念:你如说车,只是你脑中的一个认识,一类事物
实例是具体的实现:比如一辆奔驰。
类:
public class ren
{string 一个鼻子;
int 两个眼睛
}
实例1:
ren 张山=new ren();
张山.鼻子="高鼻梁";
张山.眼睛="双眼皮";
实例2:
ren 张山=new ren();
张山.鼻子="低鼻梁";
张山.眼睛="单眼皮";
对象:抽象的对象
实例:具体的对象
对象是对一类事物的抽象概括,
而
实例,是具体的某一个物体。
比如:
汽车是对象。
而
宝马就是实例。
对像object,类class,实例instance。
有时候说“对像”是指“类”,有时候是指“实例”,要看context。
这个问题就跟interface的实际意义是什么差不多。
对象分配在内存堆里,实例分配在堆栈里。
对象是不变的东西,它是对客观事物的抽象,实例是对操作对象的引用,你不能直接操作对象。 #,广西南宁市,2017-07-14,17:09:22, 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。
而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为 1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。
再比如我要把这个五子棋游戏改为围棋游戏,如果你是面向过程设计,那么五子棋的规则就分布在了你的程序的每一个角落,要改动还不如重写。但是如果你当初就是面向对象的设计,那么你只用改动规则对象就可以了,五子棋和围棋的区别不就是规则吗?(当然棋盘大小好像也不一样,但是你会觉得这是一个难题吗?直接在棋盘对象中进行一番小改动就可以了。)而下棋的大致步骤从面向对象的角度来看没有任何变化。
当然,要达到改动只是局部的需要设计的人有足够的经验,使用对象不能保证你的程序就是面向对象,初学者或者很蹩脚的程序员很可能以面向对象之虚而行面向过程之实,这样设计出来的所谓面向对象的程序很难有良好的可移植性和可扩展性。 #,广西南宁市,2017-07-14,17:13:05, 对象是类的实例。
类:鸟类
对象:一群喜鹊
实例:一只喜鹊 #,广西南宁市,2017-07-14,17:16:30,
类:具有同种属性的对象称为类,是个抽象的概念。比如说:汽车、人、狗、神;
对象:日常生活中的所有东西都是对象,是类的实例化。比如说:推土车是汽车的实例化;姚明是人的实例化;小白(狗的名字)是狗的实例化;二郎神是神的实例化;
属性:用来描述具体某个对象的特征的是属性,是静态的。比如:姚明身高2.6米多;小白的毛发是棕色的;二郎神额头上有只眼睛;
方法:每个对象有它们自己的行为或者是使用它们的方法,比如说一只狗会跑会叫等,我们把这些行为称之为方法,是动态的,可以使用这些方法来操作一个对象;
类的成员:属性和方法称为这个对象的成员,因为它们是构成一个对象的主要部分,没有了这两样东西,那么对象也没什么存在意义了。
给个例子:
我们以Person类为例:
这就是一个"人"类,描述了"人"这个事物的大体特征
至于对象,就是将"人"具体到某一个人.
比如小王,
则可写成
这样就可以得到小王这个对象了.
我们可以通过小王这个对象来描述他自己的特征.
如
我认为这句话只是在说闭包的调用,并不是没有被c引用的话,闭包就不存在
车是一类对象,
你的车是实例。
车是class
我的车既是一个对象也是一个实例?
对象与实例表达的意思都一样啊,只是不同的说法而已。车可以包括单车,汽车等,具有车所应该有的一般特点:有车轮、可以载东西等等,那么具体到你的那辆汽车,就是车的一个实例或者说是对象。
我觉得对象是实际存在的 但可以=null
实例也是对象,但实例!=null
对象范围包括实例。
对象是:产品设计图纸;
实例是:根据图纸设计出来的产品.产品可以体现出图纸的设计思想;
图纸没有实际作用;
产品可以直接使用
女孩是个对象,,人家不都说谈对象吗
实例呢,就是老婆了,,有了主的女人,,当然这个女人也可能离婚,,的,,哈哈
某个具体的对象就是实例。。
两个有时候就是一个意思,class代表的是一类对象,而这个类中的某一个具体的对象就是一个实例。
比如说人这个类,你是属于人类的,那这个人就是一个具体的对象,也是人类的一个实例。
你是人么?你不是人,你属于人类,但是你不能代表人,你只是自己,属于人类的一个对象,也是人类的一个实例。。
其实两个我感觉就差不多是一会事。。
我觉得,对象是普遍的面向对象思想的概念,面向对象的思想并不只是针对面向对象编程而言的,即 OO != OOP。而实例,是面向对象程序设计中对对象的特有称谓,所以在针对某一门具体的面向对象的语言时,对象和实例指的是同一个事物。
对象引用!=对象
可以有多个对象引用指向同一个对象
对象=实例
不知道理解的对不对
呵呵,对象是一种类型,而实例具体的一个对象。
我们常常听老人说
帮你介绍个 “对象”
真的见面的时候 来的是一个姑娘/帅哥
这就是 对象 实例的区别
对象是概念:你如说车,只是你脑中的一个认识,一类事物
实例是具体的实现:比如一辆奔驰。
类:
public class ren
{string 一个鼻子;
int 两个眼睛
}
实例1:
ren 张山=new ren();
张山.鼻子="高鼻梁";
张山.眼睛="双眼皮";
实例2:
ren 张山=new ren();
张山.鼻子="低鼻梁";
张山.眼睛="单眼皮";
对象:抽象的对象
实例:具体的对象
对象是对一类事物的抽象概括,
而
实例,是具体的某一个物体。
比如:
汽车是对象。
而
宝马就是实例。
对像object,类class,实例instance。
有时候说“对像”是指“类”,有时候是指“实例”,要看context。
这个问题就跟interface的实际意义是什么差不多。
对象分配在内存堆里,实例分配在堆栈里。
对象是不变的东西,它是对客观事物的抽象,实例是对操作对象的引用,你不能直接操作对象。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。
而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为 1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。
再比如我要把这个五子棋游戏改为围棋游戏,如果你是面向过程设计,那么五子棋的规则就分布在了你的程序的每一个角落,要改动还不如重写。但是如果你当初就是面向对象的设计,那么你只用改动规则对象就可以了,五子棋和围棋的区别不就是规则吗?(当然棋盘大小好像也不一样,但是你会觉得这是一个难题吗?直接在棋盘对象中进行一番小改动就可以了。)而下棋的大致步骤从面向对象的角度来看没有任何变化。
当然,要达到改动只是局部的需要设计的人有足够的经验,使用对象不能保证你的程序就是面向对象,初学者或者很蹩脚的程序员很可能以面向对象之虚而行面向过程之实,这样设计出来的所谓面向对象的程序很难有良好的可移植性和可扩展性。
类:鸟类
对象:一群喜鹊
实例:一只喜鹊
类:具有同种属性的对象称为类,是个抽象的概念。比如说:汽车、人、狗、神;
对象:日常生活中的所有东西都是对象,是类的实例化。比如说:推土车是汽车的实例化;姚明是人的实例化;小白(狗的名字)是狗的实例化;二郎神是神的实例化;
属性:用来描述具体某个对象的特征的是属性,是静态的。比如:姚明身高2.6米多;小白的毛发是棕色的;二郎神额头上有只眼睛;
方法:每个对象有它们自己的行为或者是使用它们的方法,比如说一只狗会跑会叫等,我们把这些行为称之为方法,是动态的,可以使用这些方法来操作一个对象;
类的成员:属性和方法称为这个对象的成员,因为它们是构成一个对象的主要部分,没有了这两样东西,那么对象也没什么存在意义了。
给个例子:
我们以Person类为例:
Class Person
{
//人通常都有鼻子,眼睛等器官,这就是Person类的属性
private string eyes="";//建立私有成员
public string Eyes
{
set{eyes=value;}
get{return eyes;}此处为eyes的访问器,用于对eyes赋值和取值
}
//下面将声明一个方法,也称其为函数
//眼睛通常是用来看的,所以我们针对眼睛建立一个"看"的方法
public void Look()
{
//在这里可以写看的一些方法,比如如何看,看什么等等
}
}Run code
Cut to clipboard
这就是一个"人"类,描述了"人"这个事物的大体特征
至于对象,就是将"人"具体到某一个人.
比如小王,
则可写成
Person xiaowang=new Person();//这个过程叫做实例化Run code
Cut to clipboard
这样就可以得到小王这个对象了.
我们可以通过小王这个对象来描述他自己的特征.
如
xiaowang.Eyes="big";//描述小王是大眼睛
xiaowang.look()//表示小王在看Run code
Cut to clipboard
文章:JS的闭包与变量 发表时间:2017-07-14, 16:00:45
#1188
作者:广西南宁市
匿名函数与闭包的区别
匿名函数:没有函数名称的函数;
这就是匿名函数:
闭包:一个可以使用另外一个函数作用域中的变量的函数。
如下面的代码函数b就是闭包,但是这个前提是:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。
意思是说b要变成闭包的话,就必须被外包所引用,即c引用:
用一个专业一点的说法就是:函数调用返回后一个没有释放资源的栈区;
一般,当函数执行完毕后,局部活动对象会被销毁,内存中仅保存全局作用域,但闭包的情况是不一样的。闭包的活动对象依然会保存在内存中,于是像上例中,函数调用返回后,变量i是属于活动对象里面的,就是说其栈区还没有释放,但你调用c()的时候i变量保存的作用域链从b()->a()->全局去寻找作用域var i声明所在,然后找到了var i=1;然后在闭包内++i;结果,最后输出的值就是2了;不知道这么说有没人明白,如果不明白,那么只要记住它的闭包的两个点就好了,一点就是闭包的活动对象没有被销毁;第二点是作用域链的关键是他要遇到var 声明;就好了····
共同点:他们都有是函数;除此之外没有任何共同点;
下面是,阮一峰对闭包的解析;
闭包会携带它的函数的作用域,因此会比其他函数占用更多的内存,所以使用闭包要非常注意!!! #,广西南宁市,2017-07-14,16:02:18, 类是有行为的数据,闭包是有数据的行为。 #,广西南宁市,2017-07-14,16:03:54, 学习Javascript闭包(Closure)
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
下面就是我的学习笔记,对于Javascript初学者应该是很有用的。
一、变量的作用域
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域无非就是两种:全局变量和局部变量。
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
另一方面,在函数外部自然无法读取函数内的局部变量。
这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
二、如何从外部读取局部变量?
出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。
那就是在函数的内部,再定义一个函数。
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!
三、闭包的概念
上一节代码中的f2函数,就是闭包。
各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
四、闭包的用途
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
怎么来理解这句话呢?请看下面的代码。
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。
五、使用闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
六、思考题
如果你能理解下面两段代码的运行结果,应该就算理解闭包的运行机制了。
代码片段一。
代码片段二。
#,广西南宁市,2017-07-14,16:20:54, 请版主讲一讲最后一个例子怎么回事,没有看明白 #,广西南宁市,2017-07-14,16:21:10,@3 , 函数中的this一般是指向window中的变量。 #,广西南宁市,2017-07-14,16:21:27,@4 , 上面本人说得不太正确。
this的指向是由它所在函数调用的上下文决定的,而不是由它所在函数定义的上下文决定的。 #,广西南宁市,2017-07-14,16:21:43, 如果非要指向object,可显式的控制--把代码的最后一句改为 alert(object.getName().call(object)); #,广西南宁市,2017-07-14,16:22:36, 函数内部定义的方法和变量,要等到函数执行过以后,才会真正定义 #,广西南宁市,2017-07-14,16:23:43, 最后一个题感觉和闭包没什么关系啊,能详细解释一下吗?因为当一个函数作为函数而不是方法来调用的时候,this指向的是全局对象,这在《Javascript权威指南》上说的很清楚,所以答案肯定是“The Window”,和闭包没什么关系啊 #,广西南宁市,2017-07-14,16:23:51, 最后一题重点在this #,广西南宁市,2017-07-14,16:28:09, this始终表示调用者的应用,第一个的闭包返回出来的一个函数,就是在window的环境下调用了这个函数,所以这个this是指向的window,而第二个把this保存在了that中。 #,广西南宁市,2017-07-14,16:30:30, 最后两道思考题~ 其实和函数调用还有关系的~ 在以上例子中使用的是函数调用的方式,this这时候是指全局变量 #,广西南宁市,2017-07-14,16:30:40, 对于代码片段一
object.getnameFunc() 返回的匿名闭包函数被全局变量所引用,其中的this指向
全局变量,当执行时打印The Window 。
对于代码片段二
object.getnameFunc() 在返回闭包函数前,将this赋给that,此时getnameFunc是由
object调用的,故而this指向object,当内部函数被返回时,由于闭包的特性,仍然
能访问到外部函数中的值,当执行打印My Object 。 #,广西南宁市,2017-07-14,16:31:00, 代码段一、
当一个函数作为函数而不是方法调用的时候,这个this关键字引用全局对象。容易令人混淆的是,当一个嵌套的函数(作为函数)在一个包含的函数中调用,而这个包含的函数是作为方法调用的,这也是成立的:this关键字在包含的函数中有一个值,但是它却(不太直观地)引用嵌套的函数体的内部的全局对象。
所以第一个打印出来的是"The Window"
代码段二、
由于this关键字不是在包含的函数中引用的,而是通过that=this这个调用的,所以这个this不是在闭包内的,因此这个this就不能调用函数体内的全局对象,而是他的局部对象object.name,所以第二个打印出来的是"My Object" #,广西南宁市,2017-07-14,16:31:09, 关键是理清函数什么时候作为对象使用,什么时候作为函数使用。 #,广西南宁市,2017-07-14,16:31:59, object.getnameFunc()() 也可以改为object.getnameFunc().call()
这就是javascript狡猾的地方。
匿名函数:没有函数名称的函数;
这就是匿名函数:
function(argument1,argument2){
}Run code
Cut to clipboard
如下面的代码函数b就是闭包,但是这个前提是:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。
意思是说b要变成闭包的话,就必须被外包所引用,即c引用:
<script type="text/javascript">
function a(){
var i=1;
function b(){
++i;
return i;
}
return b;
}
var c=a();
alert(c());
</script>Run code
Cut to clipboard
用一个专业一点的说法就是:函数调用返回后一个没有释放资源的栈区;
一般,当函数执行完毕后,局部活动对象会被销毁,内存中仅保存全局作用域,但闭包的情况是不一样的。闭包的活动对象依然会保存在内存中,于是像上例中,函数调用返回后,变量i是属于活动对象里面的,就是说其栈区还没有释放,但你调用c()的时候i变量保存的作用域链从b()->a()->全局去寻找作用域var i声明所在,然后找到了var i=1;然后在闭包内++i;结果,最后输出的值就是2了;不知道这么说有没人明白,如果不明白,那么只要记住它的闭包的两个点就好了,一点就是闭包的活动对象没有被销毁;第二点是作用域链的关键是他要遇到var 声明;就好了····
共同点:他们都有是函数;除此之外没有任何共同点;
下面是,阮一峰对闭包的解析;
闭包会携带它的函数的作用域,因此会比其他函数占用更多的内存,所以使用闭包要非常注意!!!
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
下面就是我的学习笔记,对于Javascript初学者应该是很有用的。
一、变量的作用域
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域无非就是两种:全局变量和局部变量。
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
var n=999;
function f1(){
alert(n);
}
f1(); // 999Run code
Cut to clipboard
另一方面,在函数外部自然无法读取函数内的局部变量。
function f1(){
var n=999;
}
alert(n); // errorRun code
Cut to clipboard
这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
function f1(){
n=999;
}
f1();
alert(n); // 999Run code
Cut to clipboard
二、如何从外部读取局部变量?
出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。
那就是在函数的内部,再定义一个函数。
function f1(){
var n=999;
function f2(){
alert(n); // 999
}
}Run code
Cut to clipboard
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999Run code
Cut to clipboard
三、闭包的概念
上一节代码中的f2函数,就是闭包。
各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
四、闭包的用途
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
怎么来理解这句话呢?请看下面的代码。
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000Run code
Cut to clipboard
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。
五、使用闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
六、思考题
如果你能理解下面两段代码的运行结果,应该就算理解闭包的运行机制了。
代码片段一。
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());Run code
Cut to clipboard
代码片段二。
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());Run code
Cut to clipboard
this的指向是由它所在函数调用的上下文决定的,而不是由它所在函数定义的上下文决定的。
object.getnameFunc() 返回的匿名闭包函数被全局变量所引用,其中的this指向
全局变量,当执行时打印The Window 。
对于代码片段二
object.getnameFunc() 在返回闭包函数前,将this赋给that,此时getnameFunc是由
object调用的,故而this指向object,当内部函数被返回时,由于闭包的特性,仍然
能访问到外部函数中的值,当执行打印My Object 。
当一个函数作为函数而不是方法调用的时候,这个this关键字引用全局对象。容易令人混淆的是,当一个嵌套的函数(作为函数)在一个包含的函数中调用,而这个包含的函数是作为方法调用的,这也是成立的:this关键字在包含的函数中有一个值,但是它却(不太直观地)引用嵌套的函数体的内部的全局对象。
所以第一个打印出来的是"The Window"
代码段二、
由于this关键字不是在包含的函数中引用的,而是通过that=this这个调用的,所以这个this不是在闭包内的,因此这个this就不能调用函数体内的全局对象,而是他的局部对象object.name,所以第二个打印出来的是"My Object"
这就是javascript狡猾的地方。
文章:JS的闭包与变量 发表时间:2017-07-14, 16:00:11
#1189
作者:广西南宁市
jQuery中的on与bind绑定事件区别实例详解
bind与on的区别就在于–事件冒泡,关于jquery中的on与bind绑定事件的区别通过本文给大家实例讲解,需要的朋友参考下吧
on(events,[selector],[data],fn)
events:一个或多个用空格分隔的事件类型和可选的命名空间,如”click”或”keydown.myPlugin” 。
selector:一个选择器字符串用于过滤器的触发事件的选择器元素的后代.
data:当一个事件被触发时要传递event.data给事件处理函数。
fn:该事件被触发时执行的函数。 false 值也可以做一个函数的简写,返回false。
bind(type,[data],fn)
为每个匹配元素的特定事件绑定事件处理函数。
jQuery 3.0中已弃用此方法,请用 on()代替。
参数类型跟前面那个on一样.
bind与on的区别就在于–事件冒泡
demo1:
## 点击相应的li弹出里面内容,这里把on换成bind是一样的没有区别.也就是说on不使用selector属性与bind并无区别
demo2:
demo3
事件委托的好处
万一子元素非常多,给每个子元素都添加一个事件,会影响到性能;
为动态添加的元素也能绑上指定事件; #,广西南宁市,2017-07-14,15:51:44, javascript取网页DOM自定义属性值和设置自定义属性值的通用方法
bind与on的区别就在于–事件冒泡,关于jquery中的on与bind绑定事件的区别通过本文给大家实例讲解,需要的朋友参考下吧
on(events,[selector],[data],fn)
events:一个或多个用空格分隔的事件类型和可选的命名空间,如”click”或”keydown.myPlugin” 。
selector:一个选择器字符串用于过滤器的触发事件的选择器元素的后代.
data:当一个事件被触发时要传递event.data给事件处理函数。
fn:该事件被触发时执行的函数。 false 值也可以做一个函数的简写,返回false。
bind(type,[data],fn)
为每个匹配元素的特定事件绑定事件处理函数。
jQuery 3.0中已弃用此方法,请用 on()代替。
参数类型跟前面那个on一样.
bind与on的区别就在于–事件冒泡
demo1:
## 点击相应的li弹出里面内容,这里把on换成bind是一样的没有区别.也就是说on不使用selector属性与bind并无区别
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
$(function () {
$('ul li').on('click',function(){
alert($(this).text())
});
})
</script>Run code
Cut to clipboard
demo2:
<script>
// 这种情况你会发现点击第四个不具备事件.也就是不具备动态绑定事件能力
$(function () {
$('ul li').bind('click',function(){
alert($(this).text())
});
var ok = $('<li>4</li>');
$('ul').last().append(ok);
})
</script>Run code
Cut to clipboard
demo3
<script>
// 换成on的写法,添加selector属性,就是通过事件冒泡,进行了事件委托,把li的事件委托给其父元素,点击后面加入的li就默认绑定了事件
$(function () {
$('ul').on('click','li',function(){
alert($(this).text())
});
var ok = $('<li>4</li>');
$('ul').last().append(ok);
})
</script>Run code
Cut to clipboard
事件委托的好处
万一子元素非常多,给每个子元素都添加一个事件,会影响到性能;
为动态添加的元素也能绑上指定事件;
HTML元素,属性已经十分丰富了。但是,在某些场合下,也会显得捉襟见肘,这时候自定义属性就发挥了十分关键的作用。
Html元素的自定义属性,使用起来,十分方便,例如:
<input type=”button” value=”Click Me, Baby!” />
假设我们现在需要限制,这个按钮,只能点击2次,然后就失效了。
通常的实现方式,是可以利用全局变量的形式来记录点击次数,但我们这里用自定义属性来实现这个功能,展示一下自定义属性的优势;我们对上面的button做一下改造:
<input type=”button” value=”Click Me, Baby!” clickCount=”0” />
可以看到,我为这个button 增加了一个自定义属性 clickCount, 并将初始值设为 0;下面我们来写实现功能的js代码:
1. 给 button 增加click事件的处理
<input type=”button” value=”Click Me, Baby!” clickCount=”0” onclick=”customAttributeDemo(this);" />
2. 我们来写 customAttributeDemo(obj) 这个函数
对于IE来讲,使用自定义属性非常简单,因为IE自动将自定义属性解析到了DOM中,和标准属性没有任何区别,IE下的版本:
function customAttributeDemo(obj)
{
if (obj.clickCount === '0')
{
obj.clickCount = '1';
}
else
{
obj.disabled = true;
}
}
上面的代码在 FireFox 下将失效,因为FireFox对自定义属性的使用,限制更高,只能使用 attributes[] 集合来访问,FireFox 下的代码:
function customAttributeDemo(obj)
{
if (obj.attributes['clickCount'].nodeValue === '0')
{
obj.attributes['clickCount'].nodeValue = '1';
}
else
{
obj.disabled = true;
}
}
上面的代码,也适用于IE,所以,这个代码,就是具有兼容性的代码了,嘿嘿
感谢小秦网友的交流,他给出了 getAttribute 和 setAttribute 的方法:
function customAttributeDemo(obj)
{
if (obj.getAttribute('clickCount') === '0')
obj.setAttribute('clickCount', '1');
else
obj.disabled = true;
}Run code
Cut to clipboard
文章:书写更漂亮规范的js代码 发表时间:2017-07-13, 17:46:03
#1190
作者:广西南宁市
javascript 的 "!function" 是什么意思?
这种叫自执行函数表达式
在这种情况下,解析器在解析function关键字的时候,会将相应的代码解析成function表达式,而不是function声明。
#,广西南宁市,2017-07-13,15:17:20, #,广西南宁市,2017-07-13,15:18:13,@1 , #,广西南宁市,2017-07-13,15:19:28, 叹号后面跟函数!function
和加号后面跟函数+function
都是跟(function(){})();这个函数是一个意思,都是告诉浏览器自动运行这个匿名函数的,因为!+()这些符号的运算符是最高的,所以会先运行它们后面的函数 #,广西南宁市,2017-07-13,15:23:07,
js 中 var v=v || [] ;这种写法有什么意义?为什么不直接var v='';
这种写法就是如果v为null和undefined的就赋值[]
js 这种写法是什么意思 var a= b || c
#,广西南宁市,2017-07-14,09:50:48,
+号把字符串转成了整数 #,广西南宁市,2017-07-14,09:57:18, 
#,广西南宁市,2017-07-14,10:03:38,
箭头函数
#,广西南宁市,2017-07-14,10:22:58,
模板字符串
传统的JavaScript语言,输出模板通常是这样写的。
上面这种写法相当繁琐不方便,ES6引入了模板字符串解决这个问题。
模板字符串(template string)是增强版的字符串,用标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。
上面代码中的模板字符串,都是用反引号表示。如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。
如果使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中。
上面代码中,所有模板字符串的空格和换行,都是被保留的,比如<ul>标签前面会有一个换行。如果你不想要这个换行,可以使用trim方法消除它。
模板字符串中嵌入变量,需要将变量名写在${}之中。
大括号内部可以放入任意的JavaScript表达式,可以进行运算,以及引用对象属性。
模板字符串之中还能调用函数。
如果大括号中的值不是字符串,将按照一般的规则转为字符串。比如,大括号中是一个对象,将默认调用对象的toString方法。
如果模板字符串中的变量没有声明,将报错。
由于模板字符串的大括号内部,就是执行JavaScript代码,因此如果大括号内部是一个字符串,将会原样输出。
模板字符串甚至还能嵌套。
上面代码中,模板字符串的变量之中,又嵌入了另一个模板字符串,使用方法如下。
如果需要引用模板字符串本身,在需要时执行,可以像下面这样写。
阮一峰的es6入门
mdn文档
You-Dont-Know-JS #,广西南宁市,2017-07-14,14:36:39,@8 ,
#个人见解#
当使用的字段名、表名等与MySQL保留字冲突时(如创建名为desc的字段、往desc表中插入记录),如果不加反引号``,无法执行成功。
因此,INSERT `desc` VALUES('aa','bb');可以执行成功。而INSERT desc VALUES('aa','bb');执行失败。
而当你所使用的的字段名、表名不含有保留字时,可以不加反引号`` #,广西南宁市,2017-07-14,14:51:19,@8 , #,广西南宁市,2017-07-14,14:59:03,
二进制是Binary,简写为B
八进制是Octal,简写为O
十进制为Decimal,简写为D
十六进制为Hexadecimal,简写为H #,广西南宁市,2017-07-14,14:59:38,@12 ,
在计算机语言中常用的进制有二进制、八进制、十进制和十六进制,十进制是最主要的表达形式。
对于进制,有两个基本的概念:基数和运算规则。
基数:基数是指一种进制中组成的基本数字,也就是不能再进行拆分的数字。二进制是0和1;八进制是0-7;十进制是0-9;十六进制是0-9+A-F(大小写均可)。也可以这样简单记忆,假设是n进制的话,基数就是【0,n-1】的数字,基数的个数和进制值相同,二进制有两个基数,十进制有十个基数,依次类推。
运算规则:运算规则就是进位或错位规则。例如对于二进制来说,该规则是“满二进一,借一当二”;对于十进制来说,该规则是“满十进一,借一当十”。其他进制也是这样。 #,广西南宁市,2017-07-14,15:05:51,@12 ,
js实现二进制与十进制的相互转换 #,广西南宁市,2017-07-14,15:09:12,@14 , 注释:对数字调用 toString(10) 与调用 toString() 相同,它们返回的都是该数字的十进制形式。
ECMAScript 类型转换 #,广西南宁市,2017-07-14,15:23:39,@14 , 十进制转二进制
用2辗转相除至结果为1
将余数和最后的1从下向上倒序写
就是结果
例如
302 302/2 = 151 余0
151/2 = 75 余1
75/2 = 37 余1
37/2 = 18 余1
18/2 = 9 余0
9/2 = 4 余1
4/2 = 2 余0
2/2 = 1 余0
故二进制为100101110
二进制转十进制
从最后一位开始算
依次列为第0、1、2...位
第n位的数(0或1)乘以2的n次方
得到的结果相加就是答案
例如:01101011
转十进制:
第0位:1乘2的0次方=1 1乘2的1次方=2 0乘2的2次方=0 1乘2的3次方=8 0乘2的4次方=0 1乘2的5次方=32 1乘2的6次方=64 0乘2的7次方=0 然后:1+2+0 +8+0+32+64+0=107. 二进制01101011=十进制107. #,广西南宁市,2017-07-14,15:25:39,@10 , 错误 #,广西南宁市,2017-07-14,15:26:49,@8 , 反引号怎么打
今天我发现我从来没打过这外符号, 直接按下即可....
刚开始我还一直在找没找到..... #,广西南宁市,2017-07-14,15:29:04,@17 , #,广西南宁市,2017-07-14,15:41:45,@16 ,
#,广西南宁市,2017-07-14,15:44:58,
这种叫自执行函数表达式
在这种情况下,解析器在解析function关键字的时候,会将相应的代码解析成function表达式,而不是function声明。
// 下面2个括弧()都会立即执行
(function () { /* code */ } ()); // 推荐使用这个
(function () { /* code */ })(); // 但是这个也是可以用的
// 由于括弧()和JS的&&,异或,逗号等操作符是在函数表达式和函数声明上消除歧义的
// 所以一旦解析器知道其中一个已经是表达式了,其它的也都默认为表达式了
var i = function () { return 10; } ();
true && function () { /* code */ } ();
0, function () { /* code */ } ();
// 如果你不在意返回值,或者不怕难以阅读
// 你甚至可以在function前面加一元操作符号
!function () { /* code */ } ();
~function () { /* code */ } ();
-function () { /* code */ } ();
+function () { /* code */ } ();Run code
Cut to clipboard
<script>
var s=function(){
return 1;
}
alert(s());
alert(s);
</script>Run code
Cut to clipboard
<script>
var s=function(n){
return n;
}
alert(s(2));
alert(s);
</script>Run code
Cut to clipboard
和加号后面跟函数+function
都是跟(function(){})();这个函数是一个意思,都是告诉浏览器自动运行这个匿名函数的,因为!+()这些符号的运算符是最高的,所以会先运行它们后面的函数
还有比如x=x||{};
(function(){})();Run code
Cut to clipboard
var x=1 || 2 || 3;x值为1或者2或者3
x=2||3;x值为2或者3
var a=1||2;
var b=2||3;
a&b结果是2Run code
Cut to clipboard
js 中 var v=v || [] ;这种写法有什么意义?为什么不直接var v='';
这种写法就是如果v为null和undefined的就赋值[]
js 这种写法是什么意思 var a= b || c
在js中,这相当于一个赋值语句,如果b的值大于0或为true,那么就把b的值赋给a,否在就把c的值赋给a
布尔值,javascript中以下值会被转换为false
false
undefined
null
0
-0
NaN
""
''Run code
Cut to clipboard
+号把字符串转成了整数
<script>
var n='5';
console.log(n.constructor);
console.log((+n).constructor);
console.log(typeof(n));
console.log(typeof(+n));
console.log(isNaN(n));
//console.log(Number.n);
console.log(Number.NaN);
</script>Run code
Cut to clipboard
箭头函数
var nums = [4, 8, 1, 9, 0];
nums.sort(a, b => b - a);
setTimeout(() => console.log("hi"), 3000);Run code
Cut to clipboard
JavaScript 中反单引号 ` `
function () {
return `${this.index * (100 / this.number)}%`;
}Run code
Cut to clipboard
模板字符串
传统的JavaScript语言,输出模板通常是这样写的。
$('#result').append(
'There are <b>' + basket.count + '</b> ' +
'items in your basket, ' +
'<em>' + basket.onSale +
'</em> are on sale!'
);Run code
Cut to clipboard
上面这种写法相当繁琐不方便,ES6引入了模板字符串解决这个问题。
$('#result').append(`
There are <b>${basket.count}</b> items
in your basket, <em>${basket.onSale}</em>
are on sale!
`);Run code
Cut to clipboard
模板字符串(template string)是增强版的字符串,用
反引号(`)Run code
Cut to clipboard
// 普通字符串
`In JavaScript '\n' is a line-feed.`
// 多行字符串
`In JavaScript this is
not legal.`
console.log(`string text line 1
string text line 2`);
// 字符串中嵌入变量
var name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`Run code
Cut to clipboard
上面代码中的模板字符串,都是用反引号表示。如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。
var greeting = `\`Yo\` World!`;Run code
Cut to clipboard
如果使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中。
$('#list').html(`
<ul>
<li>first</li>
<li>second</li>
</ul>
`);Run code
Cut to clipboard
上面代码中,所有模板字符串的空格和换行,都是被保留的,比如<ul>标签前面会有一个换行。如果你不想要这个换行,可以使用trim方法消除它。
$('#list').html(`
<ul>
<li>first</li>
<li>second</li>
</ul>
`.trim());Run code
Cut to clipboard
模板字符串中嵌入变量,需要将变量名写在${}之中。
function authorize(user, action) {
if (!user.hasPrivilege(action)) {
throw new Error(
// 传统写法为
// 'User '
// + user.name
// + ' is not authorized to do '
// + action
// + '.'
`User ${user.name} is not authorized to do ${action}.`);
}
}Run code
Cut to clipboard
大括号内部可以放入任意的JavaScript表达式,可以进行运算,以及引用对象属性。
var x = 1;
var y = 2;
`${x} + ${y} = ${x + y}`
// "1 + 2 = 3"
`${x} + ${y * 2} = ${x + y * 2}`
// "1 + 4 = 5"
var obj = {x: 1, y: 2};
`${obj.x + obj.y}`
// 3Run code
Cut to clipboard
模板字符串之中还能调用函数。
function fn() {
return "Hello World";
}
`foo ${fn()} bar`
// foo Hello World barRun code
Cut to clipboard
如果大括号中的值不是字符串,将按照一般的规则转为字符串。比如,大括号中是一个对象,将默认调用对象的toString方法。
如果模板字符串中的变量没有声明,将报错。
// 变量place没有声明
var msg = `Hello, ${place}`;
// 报错Run code
Cut to clipboard
由于模板字符串的大括号内部,就是执行JavaScript代码,因此如果大括号内部是一个字符串,将会原样输出。
`Hello ${'World'}`
// "Hello World"Run code
Cut to clipboard
模板字符串甚至还能嵌套。
const tmpl = addrs => `
<table>
${addrs.map(addr => `
<tr><td>${addr.first}</td></tr>
<tr><td>${addr.last}</td></tr>
`).join('')}
</table>
`;Run code
Cut to clipboard
上面代码中,模板字符串的变量之中,又嵌入了另一个模板字符串,使用方法如下。
const data = [
{ first: '<Jane>', last: 'Bond' },
{ first: 'Lars', last: '<Croft>' },
];
console.log(tmpl(data));
// <table>
//
// <tr><td><Jane></td></tr>
// <tr><td>Bond</td></tr>
//
// <tr><td>Lars</td></tr>
// <tr><td><Croft></td></tr>
//
// </table>Run code
Cut to clipboard
如果需要引用模板字符串本身,在需要时执行,可以像下面这样写。
// 写法一
let str = 'return ' + '`Hello ${name}!`';
let func = new Function('name', str);
func('Jack') // "Hello Jack!"
// 写法二
let str = '(name) => `Hello ${name}!`';
let func = eval.call(null, str);
func('Jack') // "Hello Jack!"Run code
Cut to clipboard
阮一峰的es6入门
mdn文档
You-Dont-Know-JS
#个人见解#
当使用的字段名、表名等与MySQL保留字冲突时(如创建名为desc的字段、往desc表中插入记录),如果不加反引号``,无法执行成功。
因此,INSERT `desc` VALUES('aa','bb');可以执行成功。而INSERT desc VALUES('aa','bb');执行失败。
而当你所使用的的字段名、表名不含有保留字时,可以不加反引号``
<input value="Test" type="button" onclick="alert("OK");" />
<input value="Test1" type="button" onclick="alert('OK1');" />
<input value="Test2" type="button" onclick='alert("OK2");' />Run code
Cut to clipboard
二进制是Binary,简写为B
八进制是Octal,简写为O
十进制为Decimal,简写为D
十六进制为Hexadecimal,简写为H
在计算机语言中常用的进制有二进制、八进制、十进制和十六进制,十进制是最主要的表达形式。
对于进制,有两个基本的概念:基数和运算规则。
基数:基数是指一种进制中组成的基本数字,也就是不能再进行拆分的数字。二进制是0和1;八进制是0-7;十进制是0-9;十六进制是0-9+A-F(大小写均可)。也可以这样简单记忆,假设是n进制的话,基数就是【0,n-1】的数字,基数的个数和进制值相同,二进制有两个基数,十进制有十个基数,依次类推。
运算规则:运算规则就是进位或错位规则。例如对于二进制来说,该规则是“满二进一,借一当二”;对于十进制来说,该规则是“满十进一,借一当十”。其他进制也是这样。
js实现二进制与十进制的相互转换
<script>
var a = 1010;
alert(a.toString(2)); //转成二进制
alert(parseInt( "101110100 ",2)) ;//转成十进制
</script>Run code
Cut to clipboard
var iNum = 10;
alert(iNum.toString(2)); //输出 "1010"
alert(iNum.toString(8)); //输出 "12"
alert(iNum.toString(16)); //输出 "A"Run code
Cut to clipboard
ECMAScript 类型转换
用2辗转相除至结果为1
将余数和最后的1从下向上倒序写
就是结果
例如
302 302/2 = 151 余0
151/2 = 75 余1
75/2 = 37 余1
37/2 = 18 余1
18/2 = 9 余0
9/2 = 4 余1
4/2 = 2 余0
2/2 = 1 余0
故二进制为100101110
二进制转十进制
从最后一位开始算
依次列为第0、1、2...位
第n位的数(0或1)乘以2的n次方
得到的结果相加就是答案
例如:01101011
转十进制:
第0位:1乘2的0次方=1 1乘2的1次方=2 0乘2的2次方=0 1乘2的3次方=8 0乘2的4次方=0 1乘2的5次方=32 1乘2的6次方=64 0乘2的7次方=0 然后:1+2+0 +8+0+32+64+0=107. 二进制01101011=十进制107.
<input value="Test" type="button" onclick="alert("OK");" />Run code
Cut to clipboard
今天我发现我从来没打过这外符号
` 就是键盘的左上方, 1的左边不需要组合键Run code
Cut to clipboard
刚开始我还一直在找没找到.....
浅析Js中的单引号与双引号问题
单引号和双引号其实没啥区别,看你自己习惯了
<input type="button" onclick="alert("1")">-------------------不正确
<input type="button" onclick="alert('1')">-------------------正确
双引号中再用双引号要这样:
var str = "abc\"def\"ghi"
用反斜杠来禁止解析双引号。
下面是我摘录的,希望对你有用:
在一个网页中的按钮,写onclick事件的处理代码,不小心写成如下:
<input value="Test" type="button" onclick="alert(""OK"");" />
IE提示出错后,再漫不经心地改为:
<input value="Test" type="button" onclick="alert(\"OK\");" />
结果还是出错。
这时,我就想不通了,虽然我知道最直接的解决方法是写成这样:
<input value="" type="button" onclick="alert('OK');" />
但为什么javascript中的转义字符\没有效果了呢?
后来找到一段正常的代码:
<input value="Test" type="button" onclick="alert("OK");" />
这时才理解,原来这时,还是归于HTML的管辖范围,所以转义字符应该使用HTML的,而不是javascript的。两个双引号的做法是vbScript的,\"这种做法则是javascript的,而HTML的,则是用"(转义字符),此外还可以使用:(转义字符)"、'。
下面列出各种表达方法:
<html>
<body>
<input value="外双引号内双引号-错误" type="button" onclick="alert("OK");" /><br />
<input value="外单引号内单引号-错误" type="button" onclick='alert('OK');' /><br />
<input value="两个双引号-错误" type="button" onclick="alert(""OK"");" /><br />
<input value="两个单引号-错误" type="button" onclick="alert(''OK'');" /><br />
<input value="\+双引号-错误" type="button" onclick="alert(\"OK\");" /><br />
<input value="\+单引号-错误" type="button" onclick="alert(\'OK\');" /><br />
<input value="外双引号内单引号-OK" type="button" onclick="alert('OK');" /><br />
<input value="外单引号内双引号-OK" type="button" onclick='alert("OK");' /><br />
<input value="外部不使用引号-OK" type="button" onclick=alert('OK');alert("OK"); /><br />
<input value="HTML转义字符"(& # 3 4 ;)-OK" type="button" onclick="alert("OK");" /><br />
<input value="HTML转义字符'(& # 3 9 ;)-OK" type="button" onclick="alert('OK');" /><br />
<input value="HTML转义字符"(& # x 2 2 ;)-OK" type="button" onclick="alert('OK');" /><br />
<input value="HTML转义字符'(& # x 2 7 ;)-OK" type="button" onclick="alert('OK');" /><br />
<input value="HTML转义字符"(& q u o t ;)-OK" type="button" onclick="alert("OK");" /><br />
<input value="HTML转义字符'(& a p o s ;)-IE错误" type="button" onclick="alert('OK');" /><br />
<input value="其它\\-错误" type="button" onclick="alert(\\"OK\\");" /><br />
<input value="其它\& # 3 4 ;-错误" type="button" onclick="alert(\"OK\");" /><br />
</body>
</html>Run code
Cut to clipboard
比如2进制数 101.101 转化为十进制
1 0 1 . 1 0 1
按次序来每个括号代表一个数
(2的2次方)+0+(2的0次方)+(2的-1次方)+0+(2的-2次方)
意思就是小数点 后面 按 -1 -2 -3 的次序来开方
2的-2次方等于2的2次方分之一.一个数的负的X次方等于这个数的X次方分之一.Run code
Cut to clipboard
前端双引号单引号,正则反向引用,js比较jq
1.js,jq,css,html属性必须双,如果同时出现需要嵌套使用,属性的规范是双但是也可以用单测试有效
单引号现象举例:
jq中获取元素标签是单引号:$('input').click;弹出也是单引号: alert('aaaa');jq根据id获取元素和设置css都一般用单引号:$('#box').css('color', 'red');
上述两种情况全部换成双引号也是行的!
2.分号的用法:
{}作为函数体一般是不需要分号结束的,()一般需要分号结束,除非作为一个函数的参数就不需要分号;
3.js和jq的比较:
jquuery是获取的时候是根据css获取元素一样的用.# 而原生的Js却是document.getElementById('box')
没有那些特殊符号,可以看出jq是为了兼容css的特点,更加接近于面向对象的编程传递参数以字面值对象的
形式进行传递参数,也就是js中的字母表示的内容getElementById是用.#这些符号代替了
4.jq的难点
#box + p {
color:green;
}当前元素的下一个兄弟节点元素;
#box ~ p {
color:red;
}
当前元素的后面所有兄弟节点元素;
5.正则的反向引用:
正则表达式在函数中用的时候最好是单引号:$reg3='/(\d)\1{2}-(\d)\2{2}-(\d)\3{2}/i';其中\1表示反向引用;
preg_match($reg3,$str3,$res);Run code
Cut to clipboard
文章:书写更漂亮规范的js代码 发表时间:2017-07-13, 15:11:33
#1191
作者:广西南宁市
紧挨着两家服装企业,用一大块布料的西装50元愁卖,一小块材料的内衣1000元抢着买,同一个行业,同一个地区,冰火两重天。
这就是一个时代的真实写照,也是我经常会说的一句话:“只有产业的新陈代谢,没有帝国的夕阳。” #,广西南宁市,2017-05-26,14:46:36, 他们是通过一次次美好而成功的战术,让自己最终陷入了战略困境之网,现在是越挣扎,网子勒得越紧。 #,广西南宁市,2017-07-14,00:08:35, 黑夜行号背景黑色 #,广西南宁市,2017-07-14,10:23:58,@24 , 楼中楼再回复的时候不跳转
这就是一个时代的真实写照,也是我经常会说的一句话:“只有产业的新陈代谢,没有帝国的夕阳。”
文章:@意见反馈/技术支持/伊网/安企网 发表时间:2017-05-26, 14:39:35
#1192
展开↯#1193
作者:广西南宁市
js中函数表达式、函数声明和立即执行函数归纳
函数声明、函数表达式、匿名函数
函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明。
函数表达式 var fnName = function () {…};使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。
匿名函数:function () {}; 使用function关键字声明一个函数,但未给函数命名,所以叫匿名函数,匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。
函数声明和函数表达式不同之处在于,一、JavaScript引擎在解析javascript代码时会‘函数声明提升’(Function declaration Hoisting)当前执行环境(作用域)上的函数声明,而函数表达式必须等到Javascirtp引擎执行到它所在行时,才会从上而下一行一行地解析函数表达式,二、函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以fnName()形式调用 。以下是两者差别的两个例子。
在理解了一些函数基本概念后,回头看看( function(){…} )()和( function (){…} () )这两种立即执行函数的写法,最初我以为是一个括号包裹匿名函数,并后面加个括号立即调用函数,当时不知道为什么要加括号,后来明白,要在函数体后面加括号就能立即调用,则这个函数必须是函数表达式,不能是函数声明。
可以看到输出结果,在function前面加!、+、 -甚至是逗号等到都可以起到函数定义后立即执行的效果,而()、!、+、-、=等运算符,都将函数声明转换成函数表达式,消除了javascript引擎识别函数表达式和函数声明的歧义,告诉javascript引擎这是一个函数表达式,不是函数声明,可以在后面加括号,并立即执行函数的代码。
加括号是最安全的做法,因为!、+、-等运算符还会和函数的返回值进行运算,有时造成不必要的麻烦。
不过这样的写法有什么用呢?
javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。
jQuery使用的就是这种方法,将jquery代码包裹在( function (window,undefined){…jquery代码…} (window)中,在全局作用域中调用JQuery代码时,可以达到保护JQuery内部变量的作用。
函数声明、函数表达式、匿名函数
函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明。
函数表达式 var fnName = function () {…};使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。
匿名函数:function () {}; 使用function关键字声明一个函数,但未给函数命名,所以叫匿名函数,匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。
函数声明和函数表达式不同之处在于,一、JavaScript引擎在解析javascript代码时会‘函数声明提升’(Function declaration Hoisting)当前执行环境(作用域)上的函数声明,而函数表达式必须等到Javascirtp引擎执行到它所在行时,才会从上而下一行一行地解析函数表达式,二、函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以fnName()形式调用 。以下是两者差别的两个例子。
fnName();
function fnName(){
...
}//正常,因为‘提升’了函数声明,函数调用可在函数声明之前
fnName();
var fnName=function(){
...
}//报错,变量fnName还未保存对函数的引用,函数调用必须在函数表达式之后
var fnName=function(){
alert('Hello World');
}();//函数表达式后面加括号,当javascript引擎解析到此处时能立即调用函数
function fnName(){
alert('Hello World');
}();//不会报错,但是javascript引擎只解析函数声明,忽略后面的括号,函数声明不会被调用
function(){
console.log('Hello World');
}();//语法错误,虽然匿名函数属于函数表达式,但是未进行赋值操作,
//所以javascript引擎将开头的function关键字当做函数声明,报错:要求需要一个函数名Run code
Cut to clipboard
在理解了一些函数基本概念后,回头看看( function(){…} )()和( function (){…} () )这两种立即执行函数的写法,最初我以为是一个括号包裹匿名函数,并后面加个括号立即调用函数,当时不知道为什么要加括号,后来明白,要在函数体后面加括号就能立即调用,则这个函数必须是函数表达式,不能是函数声明。
(function(a){
console.log(a); //firebug输出123,使用()运算符
})(123);
(function(a){
console.log(a); //firebug输出1234,使用()运算符
}(1234));
!function(a){
console.log(a); //firebug输出12345,使用!运算符
}(12345);
+function(a){
console.log(a); //firebug输出123456,使用+运算符
}(123456);
-function(a){
console.log(a); //firebug输出1234567,使用-运算符
}(1234567);
var fn=function(a){
console.log(a); //firebug输出12345678,使用=运算符
}(12345678)Run code
Cut to clipboard
可以看到输出结果,在function前面加!、+、 -甚至是逗号等到都可以起到函数定义后立即执行的效果,而()、!、+、-、=等运算符,都将函数声明转换成函数表达式,消除了javascript引擎识别函数表达式和函数声明的歧义,告诉javascript引擎这是一个函数表达式,不是函数声明,可以在后面加括号,并立即执行函数的代码。
加括号是最安全的做法,因为!、+、-等运算符还会和函数的返回值进行运算,有时造成不必要的麻烦。
不过这样的写法有什么用呢?
javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。
jQuery使用的就是这种方法,将jquery代码包裹在( function (window,undefined){…jquery代码…} (window)中,在全局作用域中调用JQuery代码时,可以达到保护JQuery内部变量的作用。
文章:书写更漂亮规范的js代码 发表时间:2017-07-13, 15:27:59
#1194
作者:广西南宁市
js取整数四舍五入
1.丢弃小数部分,保留整数部分
parseInt(5/2)
2.向上取整,有小数就整数部分加1
Math.ceil(5/2)
3,四舍五入.
Math.round(5/2)
4,向下取整
Math.floor(5/2)
Math 对象的方法
FF: Firefox, N: Netscape, IE: Internet Explorer
方法 描述 FF N IE
abs(x) 返回数的绝对值 1 2 3
acos(x) 返回数的反余弦值 1 2 3
asin(x) 返回数的反正弦值 1 2 3
atan(x) 以介于 -PI/2 与 PI/2 弧度之间的数值来返回 x 的反正切值 1 2 3
atan2(y,x) 返回从 x 轴到点 (x,y) 的角度(介于 -PI/2 与 PI/2 弧度之间) 1 2 3
ceil(x) 对一个数进行上舍入。 1 2 3
cos(x) 返回数的余弦 1 2 3
exp(x) 返回 e 的指数。 1 2 3
floor(x) 对一个数进行下舍入。 1 2 3
log(x) 返回数的自然对数(底为e) 1 2 3
max(x,y) 返回 x 和 y 中的最高值 1 2 3
min(x,y) 返回 x 和 y 中的最低值 1 2 3
pow(x,y) 返回 x 的 y 次幂 1 2 3
random() 返回 0 ~ 1 之间的随机数 1 2 3
round(x) 把一个数四舍五入为最接近的整数 1 2 3
sin(x) 返回数的正弦 1 2 3
sqrt(x) 返回数的平方根 1 2 3
tan(x) 返回一个角的正切 1 2 3
toSource() 代表对象的源代码 1 4 -
valueOf() 返回一个 Math 对象的原始值Run code
Cut to clipboard
文章:JS浮点数运算多出很多位小数点Bug的解决办法 发表时间:2017-07-13, 14:38:20
#1195
作者:广西南宁市
js中三种作用域详解(全局,函数,块级)
1.全局变量:声明在函数外部的变量(所有没有var直接赋值的变量都属于全局变量)
2.局部变量:声明在函数内部的变量(所有没有var直接赋值的变量都属于全局变量)
JS中变量申明分显式申明和隐式申明。
在函数中使用var关键字进行显式申明的变量是做为局部变量,而没有用var关键字,使用直接赋值方式声明的是全局变量。
当我们使用访问一个没有声明的变量时,JS会报错。而当我们给一个没有声明的变量赋值时,JS不会报错,相反它会认为我们是要隐式申明一个全局变量,这一点一定要注意。
全局作用域针对于全局变量来说;
全局变量在整个上下文都有效只是在没有赋值之前调用,会输出undefin
函数作用域是针对局部变量来说的,在函数中定义的变量在函数外不能获取
块级作用域
概念“{}”中间的部分都是块级作用域ex:for while if ,js中没有块级作用域,但是可以用闭包实现类似功能。
#,广西南宁市,2017-07-13,10:25:04, 在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域)。而在javascript中则没有块级作用域,首先来看一段代码:
对于有块级作用域的语言来说,for语句中定义并初始化的变量i在循环外是无法访问的,而在javascript中,for语句中定义的变量i在循环结束后,依旧会存在于循环外部的执行环境(作用域)中,在这里i的作用域是全局环境。具体来说就是:使用var关键字声明变量时,这个变量会自动添加到距离最近的可用环境中。对于函数而言,这个最近的环境就是函数的局部环境。如果变量在未经声明的情况下被初始化,则该变量会被自动添加到全局环境。
不过有时候的确很需要块级作用域来解决一些问题,这时候我们就可以使用匿名函数来模仿块级作用域。
匿名函数就是没有名字的函数,有时候也被称为拉姆达(lamda)函数。形式如下:
而用作模仿块级作用域(私有作用域)的匿名函数的语法形式如下:
以上代码的意思是:首先定义并立即调用一个匿名函数。将函数声明包含在圆括号中,表示它实际上是一个函数表达式。而紧随其后的另一对圆括号表示立即调用这个函数。
可能刚开始我们感觉这种语法比较难以理解,我们可以先看下下面这段代码:
上面的代码中,首先以函数表达式的方式定义了一个函数,然后立即调用它。在这里定义函数的方式就是先创建一个匿名函数,然后将其赋值给变量myFunc,而在函数名称后加一对圆括号即表示调用函数。那我们如果直接用匿名函数代表变量myFunc,在匿名函数后面添加一对圆括号不就表示直接调用了吗?然而,如果如下这样做就会报错:
因为在javascript中,function关键字表示一个函数声明的开始,而函数声明后面不能直接跟圆括号。而函数表达式后面可以跟圆括号,来表示函数调用。在函数声明外面加一对圆括号就可以转换成函数表达式,如下:
这样最简单的块级作用域就创建好了。这种技术长在全局作用域中用在函数外部,来限制向全局作用域中添加过多的变量和函数。例如:
以上代码放在全局作用域中,用来确定在1月1日显示一条祝贺新年的信息。其中变量now现在就是匿名函数模仿的块级作用域中的局部变量。
当然,只要我们临时需要一些变量,都可以使用块级作用域(私有作用域)。当匿名函数执行完毕,其作用域链立即销毁,从而可以减少闭包占用资源问题。
1.全局变量:声明在函数外部的变量(所有没有var直接赋值的变量都属于全局变量)
2.局部变量:声明在函数内部的变量(所有没有var直接赋值的变量都属于全局变量)
JS中变量申明分显式申明和隐式申明。
var i=100;//显式申明
i=100;//隐式申明Run code
Cut to clipboard
在函数中使用var关键字进行显式申明的变量是做为局部变量,而没有用var关键字,使用直接赋值方式声明的是全局变量。
当我们使用访问一个没有声明的变量时,JS会报错。而当我们给一个没有声明的变量赋值时,JS不会报错,相反它会认为我们是要隐式申明一个全局变量,这一点一定要注意。
全局作用域针对于全局变量来说;
<script>
alert(c);//输出undefind
// alert(d);报错错
var c=3;
function test(){
var a=1;
b=2;
alert(c)//输出三
}
alert(c);//输出3
test();
</script>Run code
Cut to clipboard
全局变量在整个上下文都有效只是在没有赋值之前调用,会输出undefin
函数作用域是针对局部变量来说的,在函数中定义的变量在函数外不能获取
<script>function test(){
alert(a);//声明未赋值输出undefine
var a=1;
alert(a);//1
}
// alert(a);报错,外部获取不到
test();
//alert(a);保存不能输出
</script>Run code
Cut to clipboard
块级作用域
概念“{}”中间的部分都是块级作用域ex:for while if ,js中没有块级作用域,但是可以用闭包实现类似功能。
<script>
var i=1;
if(i==1){
var b=2;
}
alert(b);//输出2
for(var j=0;j<=2;j++){
var c=3;
}
alert(c);//输出3
</script>Run code
Cut to clipboard
function test(){
for(var i = 1 ; i <=5; i++){ //i
alert(i);
}
//alert(i); //6
}
*/
//test();Run code
Cut to clipboard
对于有块级作用域的语言来说,for语句中定义并初始化的变量i在循环外是无法访问的,而在javascript中,for语句中定义的变量i在循环结束后,依旧会存在于循环外部的执行环境(作用域)中,在这里i的作用域是全局环境。具体来说就是:使用var关键字声明变量时,这个变量会自动添加到距离最近的可用环境中。对于函数而言,这个最近的环境就是函数的局部环境。如果变量在未经声明的情况下被初始化,则该变量会被自动添加到全局环境。
不过有时候的确很需要块级作用域来解决一些问题,这时候我们就可以使用匿名函数来模仿块级作用域。
匿名函数就是没有名字的函数,有时候也被称为拉姆达(lamda)函数。形式如下:
function functionName(arg0,arg1){
//函数体
}Run code
Cut to clipboard
而用作模仿块级作用域(私有作用域)的匿名函数的语法形式如下:
(function(){
//块级作用域
})();Run code
Cut to clipboard
以上代码的意思是:首先定义并立即调用一个匿名函数。将函数声明包含在圆括号中,表示它实际上是一个函数表达式。而紧随其后的另一对圆括号表示立即调用这个函数。
可能刚开始我们感觉这种语法比较难以理解,我们可以先看下下面这段代码:
var myFunc=function(){
alert(‘函数’);
};
myFunc();Run code
Cut to clipboard
上面的代码中,首先以函数表达式的方式定义了一个函数,然后立即调用它。在这里定义函数的方式就是先创建一个匿名函数,然后将其赋值给变量myFunc,而在函数名称后加一对圆括号即表示调用函数。那我们如果直接用匿名函数代表变量myFunc,在匿名函数后面添加一对圆括号不就表示直接调用了吗?然而,如果如下这样做就会报错:
function(){
//块级作用域
}();Run code
Cut to clipboard
因为在javascript中,function关键字表示一个函数声明的开始,而函数声明后面不能直接跟圆括号。而函数表达式后面可以跟圆括号,来表示函数调用。在函数声明外面加一对圆括号就可以转换成函数表达式,如下:
(function(){
//块级作用域
})();Run code
Cut to clipboard
这样最简单的块级作用域就创建好了。这种技术长在全局作用域中用在函数外部,来限制向全局作用域中添加过多的变量和函数。例如:
(function(){
var now=new Date();
if(now.getMonth()==0&&now.getDate()==1){
alert(“Happy new year”);
}
})();Run code
Cut to clipboard
以上代码放在全局作用域中,用来确定在1月1日显示一条祝贺新年的信息。其中变量now现在就是匿名函数模仿的块级作用域中的局部变量。
当然,只要我们临时需要一些变量,都可以使用块级作用域(私有作用域)。当匿名函数执行完毕,其作用域链立即销毁,从而可以减少闭包占用资源问题。
// js : () 表示执行
/*
function test(){
(function(){
for(var i = 1 ; i <=5; i++){ //i
alert(i);
}
})();
alert(i);
}
test();
*/
//(function(){alert('我直接执行了!');})();Run code
Cut to clipboard
文章:书写更漂亮规范的js代码 发表时间:2017-07-13, 10:18:20
#1197
作者:广西南宁市
PHP输出中文乱码的问题
用echo输出的中文显示成乱码,
其实应该是各种服务器脚本都会遇到这个问题,
根本还是编码问题,
一般来说出于编码兼容考虑大多的页面都将页面字符集定义为utf-8
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
这时候要正常显示中文需要转化一下编码方式,比如
echo iconv("GB2312","UTF-8",'中文');就不会乱码了
还有其他方法,比如
在php的echo前面加入header("Content-Type:text/html;charset=gb2312");
当然简体中文页面也可以干脆地,
把<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />中的UTF-8改成gb2312
实际中遇见奇怪的现象,
在本机服务器上正常显示的页面,传上服务器就echo出来乱码,
没仔细琢磨过这个缘由,因为通过iconv函数GB2312、UTF-8换换位置重新编码下就正常了,
不过估计肯定是APACHE,更确切说是PHP服务端的设置不同造成的,
看看PHP.INI应该就能解决。 #,广西南宁市,2017-07-12,15:56:20,
在php的echo前面加入
#,广西南宁市,2017-07-12,15:57:11, js字符串转换成数字的三种方法 #,广西南宁市,2017-07-12,15:59:06,
H5的storage(sessionstorage&localStorage)简单存储删除
众所周知,H5的storage有sessionstorage&localStorage,其中他们的共同特点是API相同
下面直接上代码,storage中的存储与删除:
存值取值删除
用echo输出的中文显示成乱码,
其实应该是各种服务器脚本都会遇到这个问题,
根本还是编码问题,
一般来说出于编码兼容考虑大多的页面都将页面字符集定义为utf-8
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
这时候要正常显示中文需要转化一下编码方式,比如
echo iconv("GB2312","UTF-8",'中文');就不会乱码了
还有其他方法,比如
在php的echo前面加入header("Content-Type:text/html;charset=gb2312");
当然简体中文页面也可以干脆地,
把<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />中的UTF-8改成gb2312
实际中遇见奇怪的现象,
在本机服务器上正常显示的页面,传上服务器就echo出来乱码,
没仔细琢磨过这个缘由,因为通过iconv函数GB2312、UTF-8换换位置重新编码下就正常了,
不过估计肯定是APACHE,更确切说是PHP服务端的设置不同造成的,
看看PHP.INI应该就能解决。
在php的echo前面加入
header("Content-Type:text/html;charset=UTF-8");Run code
Cut to clipboard
H5的storage(sessionstorage&localStorage)简单存储删除
众所周知,H5的storage有sessionstorage&localStorage,其中他们的共同特点是API相同
下面直接上代码,storage中的存储与删除:
存值取值删除
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>H5的storage</title>
</head>
<body>
<input type='button' onclick='setItems()' value='存值' />
<input type='button' onclick='getItems()' value='取值' />
<input type='button' onclick='deleteItem()' value='删除' />
</body>
<script src="js/jquery.min.js"></script>
<script>
//localStorage存值永久有效
function setItems(){
var user = {};
user.name = 'Adam Li';
user.age = 25;
user.home = 'China';
localStorage.setItem('userinfo',JSON.stringify(user));
}
//localStorage取值
function getItems(){
var data = JSON.parse(localStorage.getItem('userinfo'));
console.log("name:"+data.name+'\r age:'+data.age+"\r home:"+data.home);
}
//localStorage删除指定键对应的值
function deleteItem(){
localStorage.removeItem('userinfo');
console.log(localStorage.getItem('userinfo'));
}
</script>
</html>Run code
Cut to clipboard
文章:微信摇一摇统计次数微官网 发表时间:2017-07-12, 15:55:49
但我最最最期待的还是《电锯惊魂8》!