gpt4 book ai didi

JavaScript - 在 (closure).bind() 之后访问属性

转载 作者:行者123 更新时间:2023-12-03 06:59:25 26 4
gpt4 key购买 nike

我构建了一个相当有用的函数来识别数据类型;然而,当我愉快地编码时,我被一个相当令人担忧的困境粗鲁地打断了。

如您所知,调用 .bind({foo:'bar'}) 后在关闭时,您无法访问所述 foo “外部”属性(property);然而,在闭包内部,this.foo有效。

此外,当以这种方式分配某些内容时,您经常会面临抛出:intermediary ... blah blah is undefined当您尝试访问属性时 - 在定义它之后直接访问。下面的代码解决了这些问题,但是...

问题在代码后面解释:

"use strict";

if ('undefined' == typeof global)
{
Object.defineProperty
(
window,'global',
{
writable:false,
configurable:false,
enumerable:false,
value:window
}
);
}


Object.defineProperty
(
Function.prototype, 'wrap',
{
writable:false,
enumerable:false,
configurable:false,

value:function(jsob)
{
this.bind(jsob);

for (var i in jsob)
{ this[i] = jsob[i]; }

return this;
}
}
);


global.typeOf = function(data)
{
if ((data === null) || (data === undefined))
{ return 'void'; }

if ((data === true) || (data === false))
{ return 'bool'; }

var tpof = (({}).toString.call(data).match(/\s([a-zA-Z]+)/)[1].toLowerCase());

if ((tpof == 'array') || (tpof == 'htmlcollection') || (tpof == 'namednodemap'))
{ return 'list'; }

if ((tpof == 'global') || (tpof == 'window'))
{ return 'glob'; }

switch (tpof.substr(0,6))
{
case 'number': return 'unit';
case 'string': return (/[^\x20-\x7E\t\r\n]/.test(data) ? 'blob' : 'text');
case 'object': return 'jsob';
case 'functi': return 'func';

default: return 'node';
}
}
.wrap
({
list:'void bool unit text blob list jsob func node glob'.split(' '),
init:function()
{
this.list.forEach(function(item)
{
global[(item.toUpperCase())] = item;
global[('is'+(item[0].toUpperCase() + item.substr(1,item.length)))] = function(data)
{
return ((typeOf(data) == this.text) ? true : false);
}
.bind({text:item.toLowerCase()}); // <-- ISSUE
});

return this;
}
}).init();

所以小wrapper上面解决了这种奇怪的情况;但是,看看 <-- ISSUE 行是;看,我不能使用 wrap()在那里,我必须使用 bind() ,否则 - 在函数内部 - this未定义!!

让我澄清一下:如果您按照上面 <script> 中的方式使用整个代码全新 html 文件中的标签;只需更改 ISSUE线的bind留言:wrap ;然后尝试类似:isText("bite me!");

您将看到一个错误,指定如下内容:

cannot read property "text" from undefined ..

所以;如果你做 console.log(this)在该函数定义内;你会看到undefined .

如果有人可以帮助解决此问题,或者至少解释为什么会发生这种情况,我将非常感谢您的意见。

最佳答案

我认为这个 wrap 函数绝对没有任何用途。事实上,对于这个用例,根本没有理由使用 thisbind。就这么做

global.typeOf = function(data) {
if (data == null) return 'void';
switch (typeof data)
case "boolean": return 'bool';
case "number": return 'unit';
case "string": return /[^\x20-\x7E\t\r\n]/.test(data) ? 'blob' : 'text';
}
switch (Object.prototype.toString.call(data).slice(8, -1).toLowerCase()) {
case "array":
case "htmlcollection":
case "namednodemap": return 'list';
case "global":
case "window": return 'glob';
case "object": return 'jsob';
case "function": return 'func';
default: return 'node';
}
};
global.typeOf.list = 'void bool unit text blob list jsob func node glob'.split(' ');

global.typeOf.list.forEach(function(item) {
global[item.toUpperCase()] = item;
global['is'+item[0].toUpperCase()+item.slice(1)] = function(data) {
return typeOf(data) == item;
}
});

关于JavaScript - 在 (closure).bind() 之后访问属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37128073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com