JavaScript(ES5)使用保留字作函数名

探讨了ES5中直接使用保留字作为方法名的限制及解决方法,包括利用Unicode转义序列来规避语法错误,并提供了一种实用的转义函数。

ES5允许直接使用保留字作为属性名,但却不允许直接使用保留字作为函数名

设现有类NSMap,若要给NSMap的原型加delete方法,如

function NSMap(){

}
NSMap.prototype.delete=function delete(){

};

则浏览器解析报错

SyntaxError: Unexpected token delete

那么,为什么native code的Map可以办到?




后来想到标识符可以由除ASCII特殊字符以外的大部分Unicode字符组成,方案来了:

//1.从保留字中随便挑个字符出来,如字符t,算出字符t的十六进制charCode,

"t".charCodeAt(0).toString(16)//"74"

//2.尝试将t用\x74表示,使用dele\x74e作为函数名,不行

NSMap.prototype.delete=function dele\x74e(){
	
};

//3.尝试将t用\u0074表示,使用dele\u0074e作为函数名,总算不报错了

NSMap.prototype.delete=function dele\u0074e(){
	
};

//(这里有点不解,\x74和\u0074不是同一个意思吗,有可能是因解析器的性能考虑而不支持\x)

//4.如果函数是独立声明的,引用函数也不得直接使用字面保留字

function dele\u0074e(){
	
}
NSMap.prototype.delete=dele\u0074e;

//用得较多时,可以参照Chrome底层JavaScript源码那样写

InstallFunctions(NSMap.prototype,DONT_ENUM,[
	"extends",function ex\u0074ends(){
		
	},
	"delete",function dele\u0074e(){
		
	}
]);




另附上一个转义函数

function toCharCodeString(){
	return Array.prototype.map.call(new String(this),function(c){
		var code=c.charCodeAt(0),
			hex=code.toString(16);
		//return code>0xff?
		//		"\\u"+"000".substr(0,4-hex.length)+hex:
		//		"\\x"+"0".substr(0,2-hex.length)+hex;
		return "\\u"+"000".substr(0,4-hex.length)+hex;
	}).join("");
}
toCharCodeString.call("delete");     // "\u0064\u0065\u006c\u0065\u0074\u0065"
toCharCodeString.call("Unicode字符"); // "\u0055\u006e\u0069\u0063\u006f\u0064\u0065\u5b57\u7b26"



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值