Re[17]: jQuery – Javascript нового поколения
От: Zeroglif  
Дата: 10.08.07 20:13
Оценка:
Здравствуйте, AKS., Вы писали:

AKS>Честно говоря, надоело ждать, пока кто-нибудь исправит вот это ложное утверждение:


AKS>

AKS>a — функция
AKS>b — не функция
AKS>c — не функция

AKS>Что и следовало ожидать. Почему a — функция? Читаем ECMA-262...


AKS>Почему не протестирован этот ма-а-алюсенький кусочек кода? Нет времени и денег на тесты с одним alert'ом?


AKS, привет, спасибо за поддержку. Время — деньги.

AKS>Хорошо, пишу я:


AKS>
AKS>var a, b, c;

AKS>a = /^\dfunction\d/;
AKS>b = new String('Wow, J(ava)Script is soooo functional...');
AKS>c = ['method', 'function', 'object'];
AKS>c.constructor = 'Lego';

AKS>// ...trust me... --John :)
AKS>function isFunction(fn) {
AKS>    return !!fn && typeof fn != "string" && !fn.nodeName && 
AKS>        fn.constructor != Array && /function/i.test( fn + "" );
AKS>};

AKS>alert([isFunction(a), isFunction(b), isFunction(c)]); // -> true, true, true!!!
AKS>


AKS>Причем в случае с регвыром спецификация здесь ни при чем! Уберите символ f из рега и результат выполнения isFunction(a) будет false...


Вдвоём возможно быстрее достучимся, но похоже это тот случай, когда человек слабо представляет себе даже то, как работает любимая им функция из любимой им либы. Мне не поверил, сам не проверил и сел в лужу, выдержки из ECMAScript конечно же слегка невпопад, речь там идёт об "internal function", да и не имеет это отношение к алгоритму функции. Вообще никакого. Mamut, мои аргументы исходят от тебя самого, не жди их от меня, пиши ещё. AKS, к слову, напомню, в прошлом году здесь мы по наитию коротенько обсуждали то, что mozilla самостоятельно расширила нативный RegExp object так, что можно его вызвать /\d/('1') , но это их частное дело, согласно ES на таких объектах не должно висеть свойство [Call]], у них висит, уж очень это непростые объекты, перемудрили, отсюда и typeof /\d/ даёт function. И багом это особо не назовёшь, живёт до сих пор, подозреваю, что слишком много кода в сети завязано на таких проверках, как isFunction, и просто не стали трогать.

Несколько выдержек из ES для общего представления о том, чем по большому счёту отличается функция от не-функции (нативные объекты должны следовать этому, хостовым хорошо бы тоже, но могут врать, вроде того же alert-а в IE):

 7.8.5 Regular Expression Literals

    A regular expression literal is an input element that is converted to a RegExp object (section 15.10) when it is scanned.

8.6.2 Internal Properties and Methods

    <... из таблицы вырвал>

    [[Call]] - a list of argument values provided by the caller. Executes code associated with the object. 
    Invoked via a function call expression. Objects that implement this internal method are called functions.

11.4.3 The typeof Operator

    <...>

    5. Return a string determined by Type(Result(4)) according to the following table:
    
    <... из таблицы вырвал>
    
    Object (native and doesn't implement [[Call]]) - "object"    

15 Native ECMAScript Objects

    <... до кучи про [[Class]]>

    Unless specified otherwise, the [[Class]] property of a built-in object is "Function" if that built-in object 
    has a [[Call]] property, or "Object" if that built-in object does not have a [[Call]] property.


Ну, и дальше можно пойти непосредственно в ES15.10 поискать и не найти, положен ли таким объектам [Call]]... Повторюсь, к рассматриваемой isFunction это никаким боком не относится (но раз пошла такая пьянка), функция работает по очень простому алгоритму, который в определённых случаях просто врёт. Для jQuery и её внутренней логики такая функция может быть подходящей, но полагаться на неё отдельно для отдельных случаев я бы воздержался...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.